关于文件打开后写入数据未关闭而再次打开再次写入数据的问题

lycosme 2009-03-17 11:12:17
my_file = fopen("11.txt", "w");

fprintf(my_file,"start!\n");
//fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
fclose(my_file);


如果在中间不关闭文件,那么最后输出的一行"my file"则根本没有被写入到文件里,请问这是为什么呢?

而如果在中间再次打开文件前将文件关闭,或用fflush刷新一下缓存,则肯定是可以的。我想知道如果没刷新缓存,为什么最后的fprintf没有成功,最后不是有关闭的操作吗?是不是打开和关闭操作的次数必须对应?或者是刷一下缓存?
...全文
790 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifreshman 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoq008 的回复:]
对于代码1
关闭程序前 文件的内容是my file
关闭程序后 文件的内容是start!
这是因为关闭程序前 第2个fclose会马上把缓冲区的内容my file写到文件
关闭程序后这时会把start写入文件,但fopen("11.txt", "w");以只写方式打开
故会把原来的my file覆盖掉,故只有start!
但你如果用代码4:

C/C++ code
代码4
my……
[/Quote]

为啥我第一个程序的结果是
程序结束前是:my file
程序结束后是:startle
还有楼主的疑问????????????
赵4老师 2011-05-16
  • 打赏
  • 举报
回复
《操作系统》 文件管理
《深入解析Windows操作系统-Windows Internals》
《Windows核心编程》
lifreshman 2011-05-16
  • 打赏
  • 举报
回复
楼主的提问也是我的疑问,期待2楼得回答!
lifreshman 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoq008 的回复:]
对于代码1
关闭程序前 文件的内容是my file
关闭程序后 文件的内容是start!
这是因为关闭程序前 第2个fclose会马上把缓冲区的内容my file写到文件
关闭程序后这时会把start写入文件,但fopen("11.txt", "w");以只写方式打开
故会把原来的my file覆盖掉,故只有start!
但你如果用代码4:

C/C++ code
代码4
my……
[/Quote]

等待你的解答
lwouyang 2009-03-18
  • 打赏
  • 举报
回复
学习了!
caremsi 2009-03-18
  • 打赏
  • 举报
回复
只知道open后重新open,就得close
lycosme 2009-03-18
  • 打赏
  • 举报
回复
感谢回复,我还有几个问题:

1.
因为向文件写数据时,是先写到缓冲区的,缓冲区满了后才正式输出到文件中去。如果程序结束时缓冲区未满,又没有执行fclose,那么缓冲区的数据就会丢失,fclose在释放文件指针前,会将缓冲区中的数据输出到磁盘文件中
因此,在程序退出的时候,执行 fclose 和不执行应当是一样的。


按照这样说的话,程序退出的时候如果缓冲区未满,而又没有fclose,数据会丢失,为什么你又说“在程序退出的时候,执行 fclose 和不执行应当是一样的。”?这不是矛盾的吗?只有在缓冲区刚好满的情况下,程序退出的时候执行或不执行fclose才是一样的吧?


2.对于代码1
关闭程序前 文件的内容是my file
关闭程序后 文件的内容是start!
这是因为关闭程序前 第2个fclose会马上把缓冲区的内容my file写到文件
关闭程序后这时会把start写入文件,但fopen("11.txt", "w");以只写方式打开
故会把原来的my file覆盖掉,故只有start!


这是因为关闭程序前 第2个fclose会马上把缓冲区的内容my file写到文件
为什么关闭程序前,fclose只把my file写进去了?一共有2个fprintf,在执行fclose之前数据都写在缓冲区,为什么fclose不会依次将start和my file都写入文件呢?难道2个fprintf,对应的缓冲区是不同的吗?对于缓冲区,我不是很了解:(

此外,假设2次打开文件,所对应的缓冲区是不同的,那么2次打开和写入数据似乎可以分开来看:
对于start,应该是写在缓冲区里的,最后并没有执行fclose,在这种情况下,程序退出的时候只有缓冲区满,数据才会被写入文件。这么说满足了缓冲区满这个条件?怎么知道缓冲区满了没?


不知道我是否描述清楚了…… 再次感谢回复

lycosme 2009-03-18
  • 打赏
  • 举报
回复
up一下
xiaoQ008 2009-03-17
  • 打赏
  • 举报
回复
对于代码1
关闭程序前 文件的内容是my file
关闭程序后 文件的内容是start!
这是因为关闭程序前 第2个fclose会马上把缓冲区的内容my file写到文件
关闭程序后这时会把start写入文件,但fopen("11.txt", "w");以只写方式打开
故会把原来的my file覆盖掉,故只有start!
但你如果用代码4:
代码4
my_file = fopen("11.txt", "a");//此处也已追加方式

fprintf(my_file,"start!\n");
//fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
fclose(my_file);

这是的输出会
关闭程序前,文件内容是my file
关闭程序后,文件内容是
my file
start!
理由应该不用我解释了吧!
xiaoQ008 2009-03-17
  • 打赏
  • 举报
回复
如果程序退出的时候没有执行fclose,有可能会造成数据丢失。因为向文件写数据时,是先写到缓冲区的,缓冲区满了后才正式输出到文件中去。如果程序结束时缓冲区未满,又没有执行fclose,那么缓冲区的数据就会丢失,fclose在释放文件指针前,会将缓冲区中的数据输出到磁盘文件中
因此,在程序退出的时候,执行 fclose 和不执行应当是一样的。一般倾向于强调 fopen 和 fcose 的对称性,所以还是在程序中写上为好。
你可以分别试下如下代码
并在关闭应用程序前和关闭应用程序后分别查看11.txt文件,就可看到区别
代码1
my_file = fopen("11.txt", "w");

fprintf(my_file,"start!\n");
//fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
fclose(my_file);

代码2
my_file = fopen("11.txt", "w");

fprintf(my_file,"start!\n");
fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
//fclose(my_file);

代码3
my_file = fopen("11.txt", "w");

fprintf(my_file,"start!\n");
//fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
//fclose(my_file);

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧