文件操作函数
导论
- 文件操作函数的头文件就在标准库<stdio.h>中
- C语言在对文件进行操作时,系统会自动在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
- 文件在读取时,读取的文件会记录在一个结构体变量中,并会返回一个指向该结构体的指针,取名为FILE(该结构体名称)。
fopen函数和fclose函数
描述
- fopen函数,根据传入的文件名和打开方式来打开文件
- fclose函数,根据传入的文件指针来关闭文件
声明
- FILE * fopen ( const char * filename, const char * mode );
- int fclose ( FILE * stream );
fgetc函数和fputc函数
描述
- fgetc函数,从 文件指针所指向的输入文件中读取一个字符,返回值是读取的字符,失败会返回EOF
- fputc函数,将字符写入到文件指针所指向的输出流中,写入成功,返回写入的字符,失败会返回EOF
声明
- int fgetc( FILE * fp );
- int fputc( int c, FILE *fp );
fgets函数和fputs函数
描述
- fgets函数,从文件指针所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。
- fputs函数,把字符串写入到文件指针所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。
声明
- char *fgets( char *buf, int n, FILE *fp );
- int fputs( const char *s, FILE *fp );
fscanf函数和fprintf函数
描述
- fscanf函数,从文件指针中指向的输入流中读取格式化输入
- fprintf函数,发送格式化输出流到文件指针所指向的输出流中
声明
- int fscanf(FILE *stream, const char *format, …)
- int fprintf(FILE *stream, const char *format, …)
fread函数和fwrite函数
描述
- fread函数,从给定的流中读取数据到一个数组中(读二进制文件)
- fwrite函数,将一个数组中的数据写入到给定的流中(写二进制文件)
声明
- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
- size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
总结
文本写是要把写的数据转换成字符串,再写出去,写出去的内容是可读的,但存储值全部都变了
文件写是将内存中二进制的形式写出去,存储值不变,但如果打开来看,是一堆乱码的情况。
对比一组函数
- 序列化函数
- scanf,从控制台中读
- fscanf,从文件中读
- sscanf,从字符串中读
- 反序列化函数
- printf,打印到控制台中
- fprintf,打印到文本文件中
- sprintf,打印到字符串中
- 序列化:即将数据类型转换为字符串,将信息按可见方式写入文件,或通过网络传输,均要将其转为字符串。
- 反序列化:将字符串转化为其对应的值
文件结束的判定
- 在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束,它应用于文件读取结束时,判断是读取文件失败结束还是遇到文件尾结束。
- 文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)
- 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
其余文件操作函数
- fseek,int fseek ( FILE * stream, long int offset, int origin );根据文件指针的位置和偏移量来定位文件指针
- ftell,long int ftell ( FILE * stream ); 返回文件指针相对于起始位置的偏移量
- rewind,void rewind ( FILE * stream ); 让文件指针的位置回到文件的起始位置
- fflush,刷新缓冲区,才能将数据写入文件(硬盘)