首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fclose()导致windows崩溃

fclose()导致windows崩溃
EN

Stack Overflow用户
提问于 2013-07-03 21:53:55
回答 4查看 3.4K关注 0票数 0

由于某种原因,fclose()似乎在我正在编写的程序中导致错误。当发生这种情况时,windows终端会显示“进程返回255”。下面是代码的一部分:

代码语言:javascript
复制
FILE* output = fopen("random.txt","w");
write(c,output);
//fprintf(output,"shit\n");
fclose(output);

"write“基本上是将内容写入到输出文件中。即使程序崩溃,数据也会输出到文件中。在写操作之后,我仍然可以写到输出文件,如果我这样做了,文本将在那里,但不知何故关闭文件会导致错误。谁能给我解释一下错误代码的含义(如果有的话),以及如何解决这个错误?谢谢。

EDIT:"write()“写入输出文件,仅此而已;它对输出文件所做的唯一事情就是fprintf-ing。它不返回任何内容,因为它是一个void函数。我没有看到fclose()返回了什么,因为程序显然在我检查返回值之前就崩溃了:\

编辑:下面是"write()“的细节。我将其更改为"write_insult()“,以避免与系统调用混淆。

代码语言:javascript
复制
void write_insult(Composite c,FILE* output){
printf("lol\n");
switch (c->type){
    case SENTENCE:{
        writeSentence(c,output);
        break;
    }
    default: break;
}

}

代码语言:javascript
复制
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附带的。它之前做了一些不可靠的事情,所以会不会不是我的错呢?

编辑:也许我应该通过问这个问题来压缩这个问题:在什么情况下,fprintf可以在打开用于写入的文件上完美工作,而不是fclose,它甚至在生成返回值之前就崩溃了?

编辑:谢谢大家的帮助和建议;我发现代码中的某个地方有一个不想要的fopen操作。似乎就是这样,因为问题已经消失了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-15 19:05:14

抱歉,我不知道这里是怎么运作的。我没有更多的进展来调查到底是什么导致了崩溃,或者fclose返回了什么,但似乎在代码中的某个地方有一个不想要的fopen操作。出于某种原因,这似乎是罪魁祸首,因为问题现在已经消失了。感谢大家的帮助

票数 0
EN

Stack Overflow用户

发布于 2013-07-03 22:22:28

fclose本身很可能没问题。问题可能是您的代码中的其他地方有未定义的行为,这会导致程序稍后崩溃。崩溃恰好发生在调用fclose的过程中。我能看到的未定义行为的一个例子是:

代码语言:javascript
复制
fileName = malloc(sizeof(char)*17);
strcpy(fileName,"res/SEN/  /  .txt");

这会将18个字节(包括空终止符)写入分配的17个字节。写入number时也存在类似的缓冲区溢出。当然,在代码中的其他地方也可能存在未定义行为的其他实例,包括您没有显示的函数。尝试发现问题的一种可能方法是禁用代码部分,看看它是否仍然崩溃。

票数 2
EN

Stack Overflow用户

发布于 2013-07-03 22:24:03

代码语言:javascript
复制
 fileName = malloc(sizeof(char)*17)

正好少了一个字符(忘记了'\0'?)。也许这就是全部

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17449917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档