出于某种原因,fclose()似乎在我写的程序中导致错误。当终端发生时,windows终端显示“进程返回255”。以下是代码的一部分:
FILE* output = fopen("random.txt","w");
write(c,output);
//fprintf(output,"shit\n");
fclose(output);
“write”基本上将东西写入输出文件。即使程序崩溃,数据也会输出到文件中。在写入操作之后,我仍然可以写入输出文件,如果我这样做,文本将在那里,但不知何故关闭文件会导致错误。 有人可以向我解释错误代码可能意味着什么(如果有的话),以及如何解决这个错误?谢谢。
编辑: “write()”写入输出文件,这就是全部;它对输出文件的唯一作用是fprintf-ing。它什么都不返回,因为它是一个void函数。 没有看到fclose()返回什么,因为显然程序在我检查返回值之前崩溃了:\
编辑: 以下是“write()”的细节。我将其更改为“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);
}
编辑: 我修复了所有字符串问题,错误仍然存在。顺便说一句,如果我在writeSentence函数中声明文件指针而不是事先将文件传递给它,并在函数停止之前关闭它,不知怎的,这一切都很好。顺便说一句,编译器是Pelles C附带的编译器。之前它做过一些不稳定的事情,那么故障不在我身上吗?
编辑: 或许我应该通过提出来强调这个问题:在什么情况下fprintf可以完美地工作在一个打开写入的文件上,而不是fclose,它甚至可以在生成返回值之前崩溃?
编辑: 谢谢,伙计们,各种帮助和建议;我发现我在代码中的某处有一个不需要的fopen操作。这似乎是因为问题已经消失。
答案 0 :(得分:2)
fclose
本身很可能很好。问题可能是您在代码中的其他位置有未定义的行为,这导致程序稍后崩溃。崩溃恰好发生在调用fclose
期间。我可以看到一个未定义行为的例子是:
fileName = malloc(sizeof(char)*17);
strcpy(fileName,"res/SEN/ / .txt");
这将18个字节(包括空终止符)写入分配的17个字节。写入number
时也会出现类似的缓冲区溢出。当然,代码中的其他地方可能存在未定义行为的其他实例,包括未显示的函数。尝试找到问题的一种可能方法是禁用代码段并查看它是否仍然崩溃。
答案 1 :(得分:1)
fileName = malloc(sizeof(char)*17)
是一个简短的字符(忘记'\ 0'?)。也许这就是全部
答案 2 :(得分:0)
你要分配2个字符(比如说2个字节)
char* number = malloc(sizeof(char)*2);
if (c->subtype < 10){
然后用'0'填充第一个
number[0] = '0';
然后尝试再添加两个字符。最后一个null将溢出您分配的存储空间。在这个poing你是在借来的时间,谁知道会发生什么。如果你已经破坏了近距离使用的东西,它可能会在那里打破。
sprintf(number+1,"%d\0",c->subtype);
}else{
这里也是。
sprintf(number,"%d\0",c->subtype);
}
尝试为null终止分配至少3个字符,并使用像snprintf这样的已检查字符串副本,它将始终为null终止并且不会从数组中删除。
始终检查返回代码。
答案 3 :(得分:0)
抱歉,不知道这里有什么用处。我没有更多的进展来调查究竟是什么导致了崩溃或fclose返回了什么,但似乎在代码中的某处有一个不需要的fopen操作。由于某种原因,这似乎是罪魁祸首,因为问题现在已经消失。 谢谢大家的帮助