C 如果在同一执行过程中写入和读取文件,程序将挂起
我希望下面的代码将数字42写入一个二进制文件,然后读取并打印出确切的值。它会这样做,但不会退出,就像等待用户输入时一样暂停。下面是我解释过的代码:C 如果在同一执行过程中写入和读取文件,程序将挂起,c,fopen,fwrite,C,Fopen,Fwrite,我希望下面的代码将数字42写入一个二进制文件,然后读取并打印出确切的值。它会这样做,但不会退出,就像等待用户输入时一样暂停。下面是我解释过的代码: #include <stdio.h> #include <stdlib.h> int main(int argc, char argv[]){ char *filename = "test.db"; int *my_int = calloc(1, sizeof(int)); *my_int = 42
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char argv[]){
char *filename = "test.db";
int *my_int = calloc(1, sizeof(int));
*my_int = 42;
// First we open file to write to it
FILE *file = fopen(filename, "w");
fwrite(my_int, sizeof(int), 1, file);
fflush(file);
free(file);
// Then we want to read from it
*my_int = -1;
file = fopen(filename, "r");
fread(my_int, sizeof(int), 1, file);
free(file);
printf("Read back %d\n", *my_int);
return 0;
}
#包括
#包括
int main(int argc,char argv[]{
char*filename=“test.db”;
int*my_int=calloc(1,sizeof(int));
*my_int=42;
//首先,我们打开文件写入它
FILE*FILE=fopen(文件名,“w”);
fwrite(my_int,sizeof(int),1,file);
fflush(文件);
免费(文件);
//然后我们想从中读一读
*my_int=-1;
file=fopen(文件名为“r”);
fread(my_int,sizeof(int),1,file);
免费(文件);
printf(“读回%d\n”,*my\u int);
返回0;
}
我知道我可以简单地用
w+
标志打开它,但我只是好奇地想弄清楚它为什么会暂停。如果你不释放文件指针,你就丢失它。对使用fopen
打开的文件调用free()
是未定义的行为
我相信如果您将免费(文件)
行替换为fclose(文件)
,您的问题将得到解决
如果您只在该函数中使用calloc
,我还建议您不要为my_int
分配内存。最好将该内存放在堆栈上,即intmy\u int
而不是int*my\u int=calloc(sizeof(int))
。后者要求您稍后在程序中调用free()
,而前者则不需要。用于关闭文件
fclose(file);
此外,参考资料说:
与流关联的所有内部缓冲区都与
它冲了起来:
所以
在这里可以避免
用于释放指针的保留内存。就你而言
free(my_int);
如果放在返回
免费(文件)之前,将有意义代码>-未定义的行为当您立即覆盖放置在那里的0
s时,为什么要使用calloc
分配my_int
?如果您打算在阅读之前自己初始化它,那么使用malloc()
可能会更有效。我已经按照您的建议完成了这项工作。谢谢你的帮助。
free(my_int);