fclose文件的关闭操作
关闭指定文件,必要时刷新缓冲区。成功关闭返回0,失败EOF。
如果磁盘满了,移动硬盘被移除或出现I/O错误,都会导致调用失败。
代码说明:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *file;
//使用a追加
file =fopen("E:\\C\\vscode\\C\\demo\\qiniuschool\\user.txt", "a");
if(!file)
{
puts("file open fail!ERROR!");
}else{
puts("Open success");
}
fputs("\nnike nike123",file);
system("pause");
puts("1-paused,it will be closed if you puase again.");
puts("2-pause,will read fclose function");
system("pause");
fclose(file);
puts("3-pause,file closed!");
system("pause");
return 0;
}
user.txt
admin 123456
root root123
xiaoming xiaoming123
原本只有三行数据,
执行到fputs(),进行数据写入,但是不会直接写入,而是写到缓冲区
缓冲区写入到文件
有三种写入情况:文件结束,fclose(),fflush().
继续代码说明:
1、fclose();写入数据
第一次pause的时候,没有读到fclose,文本中没有数据写入
第二次pause的时候,缓冲区的数据遇见fclose(),读入到文本,
此时就写入了
admin 123456
root root123
xiaoming xiaoming123
nike nike123
第三次pause时候,结束程序
2、但是不使用fclose()也可以写入数据
满足上面说的三种情况中的,当我们pause三次的时候,结束就写入了
admin 123456
root root123
xiaoming xiaoming123
nike nike123
那我们为什么要用fclose
带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的(何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制)。当缓存区域中的内容达到一定大小时,标准库会将该缓存内容刷新到磁盘上,此时才完成文件的真正写入。
之前写入的内容只是存在于缓存区中,并没有真正输出到磁盘的文件里。此时如果在程序退出前调用fclose函数,有两点好处:
(1)将缓存区中的内容立刻刷到磁盘文件里,避免文件没有写入;
(2)释放文件指针。
当调用fopen对文件进行读操作时,还是要调用fclose来关闭文件指针,这是因为fopen函数打开一个文件,操作系统会分配文件描述符和I/O缓存,还有其他的一些东西,而fclose函数会关闭该文件描述符,并释放内存。所以,如果一个程序不关闭打开的文件,会造成内存泄漏(此处先借用这个词语),还有会因为操作系统因没有文件描述符可用而不能继续打开文件(后续再用fopen打开文件,返回的FILE*都为NULL)。