0%

C语言中的文件操作

文件

  • 文件一般存储在外存(硬盘、光盘、U盘等)当中,而非内存中,文件可以分为文本文件以及二进制文件,其中文本文件保存的内容是字符串,而二进制文件保存的内容是二进制数据,每个文件末尾都有一个结束符,称之为EOF
  • 文件是通过操作系统进行管理的,每个文件都有一个独一无二的名字,文件的完整路径可分为绝对路径和相对路径。绝对路径是指从盘符开始一直到文件所在位置的目录的集合,而相对路径则以当前工作目录为基准,找到一个对应文件,想要用代码操作文件,需要先知道文件的路径。

缓冲区

缓冲区就是一个内存区域,由于CPU读取内存的速度较快,而读取外存速度较慢,为了提高效率,就应尽量减少访问外存的次数,由此设立了缓冲区。在读取数据时,先将外存中的数据拷贝至内存(缓冲区),然后程序再由缓冲区进行数据读取,反之,将数据放入缓冲区,然后再写入外存。缓冲区在文件操作的过程中起到了至关重要的作用。

文件的打开和关闭(fopen、fclose)

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件,在打开文件的同时,会返回一个FILE* 的指针变量指向该文件,也相当于建立了指针和文件的关系。fopen函数和fclose函数在打开或关闭文件失败时,都会返回一个空指针NULL。

1
2
3
FIlE* fopen(const char* filename, const char* mode);
int fclose(FILE* stream);
//fopen函数和fclose函数

对于fopen函数,它的第一个参数是文件名,在传参时应输入文件的绝对路径或相对路径,第二个参数是文件的使用方式,具体如下。

文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 出错
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

需要注意的是,在使用fopen和fclose函数是,需要对返回值进行判空,以避免文件打开失败却又继续运行程序的情况。

字符输入/输出函数(fgetc/fputc)

使用fgetc来读取一个字符,使用fputc来输出一个字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int fgetc( FILE* stream );
//字符输入函数
int fputc( int c, FILE* stream );
//字符输出函数

//示例
int c;
while(c = fgetc(stdin) != EOF)
{
fputc(c, stdout);
}
//当返回值为EOF时表示读取到文件结束符
//stdin:标准输入,从键盘输入到缓冲区
//stdout:标准输出,输出到屏幕

文本行输入/输出函数(fgets/fputs)

使用fgets读取一行内容,使用fputs写入一行内容

1
2
3
4
5
6
7
8
9
10
11
12
13
char* fgets( char* string, int n, FILE* stream );
//三个参数分别是读取之后存放的位置,读取多少个字节,文件指针
int fputs( const char* string, FILE* stream );
//两个参数分别是缓冲区地址和文件指针

//示例
char buf[1024] = { 0 };//缓冲区
while(fgets(buf, sizeof(buf) - 1, fp) != NULL)
{//把文件中的内容按行读取到buf中
//减一是为了留出‘\0’的位置
//当返回值为NULL时,表示读到了EOF
fputs(buf, stdout);
}

格式化输入/输出函数(fscanf/fprintf)

格式化的读写方式,用法类似scanf和printf

1
2
3
4
5
6
7
int fscanf( FILE *stream, const char *format [, argument ]... );
int fprintf( FILE *stream, const char *format [, argument ]...);

//示例
char buf[1024] = { 0 };
fscanf(fp, "%S", buf);
fprintf(stdout, "%s", buf);

二进制输入/输出函数(fread/fwrite)

使用fread读取n个字节,使用fwrite写入n个字节

1
2
3
4
5
6
7
8
9
10
11
12
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
//返回值为实际读取到的元素个数。实际读取到的元素个数如果比预期的少,说明文件读取完毕
//参数分别为,缓冲区地址,每次读取的字节数,要写入缓存区的最大字节数,文件指针
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
//参数含分别为缓冲区地址,每次写入的字节数,最大写入字节数,文件指针

//示例
char buf[1024] = { 0 };
int n = fread(buf, 1, sizeof(buf) - 1, fp);
//减去一是为了留下‘\0’的位置
fwrite(buf, 1, strlen(buf), stdout);

小结

在文件的操作这一方面,各种编程语言的操作方式都大同小异,需要先打开文件,进行读写,最后关闭文件,需要注意的就是在打开文件后记得要关闭,否则可能会导致文件出错。

-------------本文结束感谢您的阅读-------------