C语言文件操作函数详解
注:以下文章为个人学习笔记总结,任何不理解可以随时问我。
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:
文件的打开
fopen():打开文件
FILE *fopen( const char *filename, const char *mode );
文件的关闭
fclose():关闭文件
int fclose( FILE *stream );
文件的读写
fgetc():读取一个字符
int fgetc( FILE *stream );
fputc():写入一个字符
int fputc( int ch, FILE *stream );
fgets():读取一个字符串
char *fgets( char *str, int count, FILE *stream );
fputs():写入一个字符串
int fputs( const char *str, FILE *stream );
fprintf():写入格式化数据
int fprintf( FILE *stream, const char *format, ... );
fscanf():格式化读取数据
int fscanf( FILE *stream, const char *format, ... );
fread():读取数据
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
fwrite():写入数据
int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
文件状态检查
feof():文件是否结束
int feof ( FILE * stream )
ferror():文件读/写是否出错
int ferror ( FILE * stream );
clearerr():清除文件错误标志
void clearerr ( FILE * stream )
ftell():文件指针的当前位置
long int ftell ( FILE * stream );
文件指针定位
rewind():把文件指针移到开始处
void rewind ( FILE * stream );
fseek():重定位文件指针
int fseek ( FILE * stream, long int offset, int origin );
以上代码块均来自https://cplusplus.com可以自查
参数解释:
“r”:以只读的形式打开文本文件(不存在则出错)
“w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容)
“a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加)
“r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间)
“wb”:以只写的形式打开二进制文件
“rb”:以只读的形式打开二进制文件
“ab”:以追加的形式打开一个二进制文件
“rb+”:以读写的形式打开二进制文件。
“w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失)
“a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读
“wb+”:功能与”w+”相同。只是在读写时,可以由位置函数设置读和写的起始位置
“ab+”:功能与”a+”相同。只是在文件尾部追加数据之后,可以由位置函数设置开始读的起始位置
接下来介绍部分常见的文件操作。
1、打开文件
利用fopen( )打开文件,函数如下:
FILE *fopen( constchar *filename, constchar *mode );
第一个参数:该参数为字符串类型,表示要打开的文件的名称
第二个参数:该参数为字符串类型,表示打开模式(只读、只写、更新、追加)
fopen( )函数会为要打开的文件创建流并返回一个指向文件对象的FILE*型指针。
2、关闭文件
利用fclose( )打开文件,函数如下:
intfclose( FILE *stream );
输入参数:要关闭的文件的指针
返回值:成功关闭返回0,否则返回EOF
结果如下:
成功打开文件
成功关闭文件
3、从文件中读取数据
利用fscanf( )从文件中读取数据,函数如下:
intfscanf( FILE *stream, constchar *format, ... );
与scanf( )函数比起来,fscanf( )函数多了一个输入参数即FILE *stream;它表示从哪个文件读取数据。除此以外,它与scanf( )函数完全相同。例如,要从fp中读取十进制整数值并保存是x,代码如下:
fscanf(fp,"%d",&x);
4、向文件中写入数据
利用fprintf( )向文件中写入数据,函数如下:
intfprintf( FILE *stream, constchar *format, ... );
fprintf( )函数的使用也很简单,与printf( )函数比起来它多了一个输入参数即FILE *stream;它表示向哪个文件写入数据。除此以外,它与printf( )函数完全相同。例如,要向fp中写入十进制整数值,代码如下:
fprint(fp,"%d",x);
6、fgetc( )和fputc( )
之前我们利用putchar( )和getchar( )将键盘输入的文字显示到控制台
代码如下:
#include#includeintmain(){ int ch; while((ch=getchar())!=EOF){ putchar(ch); } return0;}
在该示例中是从键盘读入数据,输出到控制台。
在此,介绍两个非常类似的函数。
首先来看fgetc( ):
intfgetc( FILE *stream );
该函数用于从文件中读取一个字符并将其转为int型作为函数的返回值。
接着来看fputc( ):
intfputc( int ch, FILE *stream );
该函数用于向文件中写入一个字符。
7、fgets( )和fputs( )
与fgetc( )和fputc( )类似,可采用fgets( )和fputs( )从文件中读出或者写入字符串。
先来看fputs( ):
intfputs( constchar *str, FILE *stream );
将str指向的字符串写入stream指向的文件流,成功返回非负数;反之EOF。请注意:该函数输入完成后不会增加额外的特殊字符(如换行符等)
示例如下:
#include#includeintmain(){ FILE *fp = fopen("D:\\test.txt", "w"); fputs("hello c programming\n", fp); fputs("hello c++ programming\n", fp); fclose(fp); puts("已将字符串写入文件"); return0;}
结果如下:
已将字符串写入文件
再来看fgets( ):
char *fgets( char *str, int count, FILE *stream );
该函数从文件指针stream指向的文件内读取字符串并保存到指针str所指向的内存空间中,直至已读size-1个字符或出现换行符或文件末尾时为止;当读取错误或者读到文件末尾EOF返回NULL。请注意:该函数会读取最后的换行符’\n’
8、fread( )和fwrite( )
虽然可使用函数 fprintf ( )和 fscanf( ) 从磁盘文件中读写任何类型的文件,但是效率并不高。所以,我们可采用fread( )和fwrite( )按照二进制的形式对文件进行读写操作。
原型如下:
size_tfread( void *buffer, size_t size, size_t count, FILE *stream );
intfwrite( constvoid *buffer, size_t size, size_t count, FILE *stream );
两个函数输入参数的个数和类型一致,概述如下:
第一个参数:指向读写数据首地址的指针。
第二个参数:要操作的单个数据的大小。例如,int型数据的大小就是sizeof(int)
第三个参数:数据个数
第四个参数:文件指针