По какой-то причине fclose(), по-видимому, вызывает ошибку в программе, которую я пишу. Терминал Windows говорит, что «процесс возвратил 255», когда это произойдет. Ниже приведена часть кода:fclose() вызывает сбой в окнах
FILE* output = fopen("random.txt","w");
write(c,output);
//fprintf(output,"shit\n");
fclose(output);
«писать» в основном пишет вещи в выходной файл. Даже при сбое программы данные выводятся в файл. После операции записи я все равно могу записать в выходной файл, и текст будет там, если я это сделаю, но как-то закрытие файла вызывает ошибку. Не мог бы кто-нибудь объяснить мне, что может означать код ошибки (если есть), и как эта ошибка может быть решена? Спасибо.
EDIT: «write()» записывает в выходной файл, и это все; единственное, что он делает с выходным файлом, - fprintf-ing. Он ничего не возвращает, потому что это функция void. Не может видеть, что fclose() возвращает потому, что по-видимому программа падает, прежде чем я могу проверить возвращаемое значение: \
EDIT: Ниже специфика «запись()». Я изменил его на "write_insult()", чтобы избежать путаницы с системным вызовом.
void write_insult(Composite c,FILE* output){
printf("lol\n");
switch (c->type){
case SENTENCE:{
writeSentence(c,output);
break;
}
default: break;
}
}
void writeSentence(Composite c,FILE* output){
FILE* source;
int random = 0;
char* fileName = NULL;
int i = 0;
char* number = malloc(sizeof(char)*2);
if (c->subtype < 10){
number[0] = '0';
sprintf(number+1,"%d\0",c->subtype);
}else{
sprintf(number,"%d\0",c->subtype);
}
fileName = malloc(sizeof(char)*17);
strcpy(fileName,"res/SEN//.txt");
fileName[8] = number[0];
fileName[9] = number[1];
fileName[11] = '0';
fileName[12] = '0';
FILE* tester = NULL;
while ((tester = fopen(fileName,"r")) != NULL){
i++;
fclose(tester);
if (i < 10){
fileName[12]++;
}else{
fileName[11]++;
fileName[12] = '0';
i = 0;
}
}
random = rand()%i;
if (random < 10){
number[0] = '0';
sprintf(number+1,"%d\0",random);
}else{
sprintf(number,"%d\0",random);
}
fileName[11] = number[0];
fileName[12] = number[1];
fileName[17] = 0;
source = fopen(fileName,"r");
Table t = parseFile(source); //remember to free
i = 0;
char* word = NULL;
while (i < t->num){
if (isInt(t->content[i])){
word = chooseWord(atoi(t->content[i]));
}else{
word = t->content[i];
}
fprintf(output,"%s ",word);
i++;
}
fclose(source);
destroyTable(t);
}
EDIT: Я установил все вопросы, струнные, и ошибка не будет устранена. Кстати, если я вместо этого объявляю указатель файла внутри функции writeSentence вместо того, чтобы заранее открывать файл, а затем закрывать его до остановки функции, как-то все в порядке. Кстати, компилятор - это тот, который поставляется с Pelles C. Раньше это делало какие-то неуклюжие вещи, может быть, вина в том, что я не виноват?
EDIT: Возможно, я должен сконденсировать вопрос, задав вместо этого: при каких обстоятельствах fprintf может работать отлично в файле, открытом для записи, но не fclose, который сбой, прежде чем он сможет даже генерировать возвращаемое значение?
EDIT: Спасибо, ребята, за любую помощь и совет; Я узнал, что у меня есть нежелательная операция fopen где-то в коде. Кажется, это так, потому что проблема ушла.
Что пишут и возвращают? – Mark
Пожалуйста, опубликуйте определение 'write()'. – hmjd
Отправьте пример, который мы можем воспроизвести, иначе вам не поможет. См. [Sscce.org] (http://sscce.org). – interjay