c++的输出 ofstream对象output 在接收到数据后先放在缓冲区中,只有在执行了output.close()之后才写入文件.
-
|
发表于: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);
| | 修改 删除 举报 引用 回复 | |
-
|
发表于: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,在这种情况下,程序退出的时候只有缓冲区满,数据才会被写入文件。这么说满足了缓冲区满这个条件?怎么知道缓冲区满了没?
不知道我是否描述清楚了…… 再次感谢回复
| |