小的心得

c++的输出  ofstream对象output 在接收到数据后先放在缓冲区中,只有在执行了output.close()之后才写入文件.

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没有成功,最后不是有关闭的操作吗?是不是打开和关闭操作的次数必须对应?或者是刷一下缓存?
 
 
10  修改 删除 举报 引用 回复 

发表于:2009-03-17 23:25:491楼 得分:0
如果程序退出的时候没有执行fclose,有可能会造成数据丢失。因为向文件写数据时,是先写到缓冲区的,缓冲区满了后才正式输出到文件中去。如果程序结束时缓冲区未满,又没有执行fclose,那么缓冲区的数据就会丢失,fclose在释放文件指针前,会将缓冲区中的数据输出到磁盘文件中 
因此,在程序退出的时候,执行 fclose 和不执行应当是一样的。一般倾向于强调 fopen 和 fcose 的对称性,所以还是在程序中写上为好。 
你可以分别试下如下代码 
并在关闭应用程序前和关闭应用程序后分别查看11.txt文件,就可看到区别 
C/C++ code
           
           
代码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);

C/C++ code
           
           
代码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);

C/C++ code
           
           
代码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);
 
修改 删除 举报 引用 回复 
进入用户个人空间
加为好友
发送私信
在线聊天
  •  xiaoQ008
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2009-03-17 23:36:232楼 得分:0
对于代码1 
关闭程序前 文件的内容是my file 
关闭程序后 文件的内容是start! 
这是因为关闭程序前 第2个fclose会马上把缓冲区的内容my file写到文件 
关闭程序后这时会把start写入文件,但fopen("11.txt", "w");以只写方式打开 
故会把原来的my file覆盖掉,故只有start! 
但你如果用代码4: 
C/C++ code
           
           
代码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! 
理由应该不用我解释了吧! 
 
修改 删除 举报 引用 回复 

    发表于:2009-03-18 00:10:383楼 得分:0
    感谢回复,我还有几个问题: 

    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,在这种情况下,程序退出的时候只有缓冲区满,数据才会被写入文件。这么说满足了缓冲区满这个条件?怎么知道缓冲区满了没? 


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

     

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值