- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
出于某种原因,fclose() 似乎导致我正在编写的程序出错。当它发生时,Windows 终端会说“进程返回 255”。以下是部分代码:
FILE* output = fopen("random.txt","w");
write(c,output);
//fprintf(output,"shit\n");
fclose(output);
“写入”基本上是将内容写入输出文件。即使程序崩溃,数据也会输出到文件中。在写入操作之后,我仍然可以写入输出文件,如果我这样做的话,文本也会在那里,但不知何故关闭文件会导致错误。有人可以向我解释错误代码可能意味着什么(如果有的话),以及如何解决这个错误?谢谢。
编辑:“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 操作。似乎是这样,因为问题已经解决了。
最佳答案
fclose
本身很可能没问题。问题可能是您的代码中其他地方有未定义的行为,这导致程序稍后崩溃。崩溃恰好发生在调用 fclose
期间。我可以看到未定义行为的一个例子是:
fileName = malloc(sizeof(char)*17);
strcpy(fileName,"res/SEN/ / .txt");
这会将 18 个字节(包括空终止符)写入分配的 17 个字节。写入number
时也有类似的缓冲区溢出。当然,代码中的其他地方可能还有其他未定义行为的实例,包括您未显示的函数。尝试查找问题的一种可能方法是禁用部分代码并查看它是否仍然崩溃。
关于c - fclose() 导致 Windows 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17449917/
在我的程序中,我可能会关闭一个已经关闭的文件。当我对一个已经关闭的文件执行 fclose 时会发生什么? 如果不能这样做,如何知道文件是关闭还是打开? 最佳答案 使用同一流调用 fclose 两次是未
为什么如果我们使用 fread() 读取文件并且不包含 fclose 来关闭相同的相同文件引用但它仍然有效。 但是,如果我们忘记在 fwrite 之后包含 fclose,那么它就不起作用。即没有写入文
我在 Linux 中运行程序时遇到段错误错误。在 AIX 中工作正常。 我在 gdb 中收到消息段错误... 程序接收信号SIGSEGV,段错误fclose@@GLIBC_2.2.5 () 来自/li
是否需要检查fclose的返回值?如果我们成功打开了一个文件,它关闭失败的可能性有多大? 最佳答案 当您fwrite到文件时,它实际上可能不会写入任何内容,它可能会保留在缓冲区中(FILE对象内部)。
假设我正在写入文件,但我想通过关闭机器电源来结束写入,这会是 fclose() 函数没有被调用的问题吗? FILE *f = fopen("file.txt", "w"); if (f == NULL
我正在尝试读取一个整数文件,其中包含文件中的整数个数作为第一个整数,但是当我在读取文件后尝试关闭该文件时,出现了段错误。 我读到,如果文件指针为空并且您尝试关闭它,则会出现段错误。但是,我在关闭它之前
我有以下 C++ 代码来将 shorts 写入 headless 音频文件: vectornShrtDecoded; nShrtDecoded.resize(iCountDecodedShorts);
我的程序有问题。使用函数 fclose() 后出现错误: "* Error in `./server': corrupted double-linked list: 0x000000000251a23
我在这段代码中遇到问题,它成功执行直到到达 fclose(fp) 语句,它崩溃了。 void read_file(const char *filename) { FILE *fp; i
为什么这个简单的函数会导致seg fault? int main(int argc, char** argv) { FILE* file1; file1 = fopen(argv[ar
每当我在最后使用 fclose(outputFile); 运行我的程序时,我都会收到错误消息。 glibc 检测到...损坏的双链表 不过,令人困惑的是,我在它的正上方有 fclose(inputFi
我最近构建了一个包装库 gorilla-audio 的 Ruby C 扩展。该库足够简单,代码干净,占用内存等。但是,当我尝试将库加载到 ruby 中时,它会抛出一个错误,内容如下: The pr
我正在编写一个函数 (*rwObjects()),它将读取格式化文件并保存它的字符串,一次一个对象。不幸的是,它对我的研究有限制 - stdio.h、stdlib.h 和 string.h 几乎是
我已经通过评论缩减了程序,缩减为: #include #include int main(int argc, char *argv[]) { FILE * in; in = fop
这个问题在这里已经有了答案: What happens if I don't call fclose() in a C program? (4 个答案) 关闭 7 年前。 根据我的阅读,fclose
我有两个函数。第一个函数是以写入模式打开一个文件并写入一些内容,然后关闭它。 FILE *fp = fopen("file.txt", "w"); //writing itnot file using
我尝试在 Linux 机器上使用 c++ fopen、fwrite、fflush 和 fclose 函数创建大约 4 GB 的文件,但我观察到 fclose() 函数需要很长时间才能关闭文件,大约需要
下面是 fclose 导致错误的源代码的一小部分?此函数并不总是被调用,在某些特定情况下会调用此函数。 int write_into_file (char * file_name) {
我一直在尝试在 C 中进行简单的文件处理,我想确保可以尝试使用此文件访问该文件 #include main() { CheckFile(); } int CheckFile() { i
是否需要检查fclose的返回值?如果我们成功打开了一个文件,它关闭失败的可能性有多大? 最佳答案 当您fwrite 到一个文件时,它实际上可能不会写任何东西,它可能会留在缓冲区中(在 FILE 对象
我是一名优秀的程序员,十分优秀!