C语言 文件读写

前言

被要求写的教程,直接删了感觉可惜,毕竟百度写了那么久,当作备忘录要用的时候看看吧。

0x00 打开文件

我们通常使用fopen()函数来打开/创建一个文件,函数原型如下:

1
FILE *fopen( const char * filename, const char * mode );

其中的filename为需要打开/新建的文件的名称,mode为打开的模式,具体描述如下:

img

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

1
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

另外函数返回值FILE*为文件指针,通常又称为文件句柄,我们进行其他文件操作时它通常作一个起标记作用的参数。

fopen() 用法举例

1
2
3
4
5
6
7
8
9
// 桌面生成 test.txt
#include <stdio.h>

int main(void)
{
FILE *fp = fopen("C:\\Users\\your_name\\Desktop\\test.txt", "w"); // 注意改为自己电脑路径

return 0;
}

0x01 关闭文件

打开一个文件后顺便书写关闭文件的代码是一个好习惯。关闭文件的函数为fclose(),函数原型如下:

1
int fclose( FILE *fp );

如果成功关闭文件,fclose( )函数返回零,如果关闭文件时发生错误,函数返回EOF

PS:EOF(end of file) 为文件结束符,在C语言中其值通常为-1(具体值还要看编译器

细心的同学可能注意到了,之前的例子没有关闭文件,在这里我们给它加上去:

1
2
3
4
5
6
7
8
9
10
// 桌面生成 test.txt
#include <stdio.h>

int main(void)
{
FILE *fp = fopen("C:\\Users\\your_name\\Desktop\\test.txt", "w"); // 注意改为自己电脑路径
// 文件读写操作
fclose(fp);
return 0;
}

在了解了打开和关闭文件之后,我们文件读写大致的框架已经有了,接下来只需要学习在打开文件和关闭文件之间的事情:写入文件和读取文件。

方便起见,之后的例子就不再把代码完整写一遍了。

0x02 写入文件

fputc()函数可以向文件中写入一个字符,其函数原型如下:

1
int fputc( int c, FILE *fp );

其中fp就是打开文件之后返回的文件指针,c为需要写入字符的ascii值。

fputc() 用法举例

1
2
3
4
// 将字符写入文件
char c = 'a';
FILE *fp = fopen("C:\\Users\\your_name\\Desktop\\test.txt", "w"); // 注意改为自己电脑路径
fputc(c, fp);

一次写一个字符似乎不太方便,而用循环解决感觉不是很优雅,fputs()用于向文件中写入一个字符串,可以解决我们的问题:

1
int fputs( const char *s, FILE *fp );

fp依旧是你打开文件的文件指针,s为需要写入的字符串。

fputs() 用法举例

1
2
3
4
// 将字符串写入文件
char *str = "PHP is the best languages for web programming :)";
FILE *fp = fopen("C:\\Users\\your_name\\Desktop\\test.txt", "w"); // 注意改为自己电脑路径
fputs(str, fp);

另外还有fprint()函数,看上去和printf()函数很像,确实如此,它只比printf()多了一个文件指针参数:

1
cint fprintf ( FILE *fp, char * format, ... );

指定你需要写入的文件的句柄,你就能像使用printf()函数一样向文件里写入内容了。

fprintf() 用法举例

1
2
3
4
5
6
// 格式化写入文件
char *s = "this is a string.";
int i = 1;
FILE *fp = fopen("C:\\Users\\your_name\\Desktop\\test.txt", "w"); // 注意改为自己电脑路径
fprintf(fp, "%s %d", s,i);
fclose(fp);

0x03 读取文件

同样地,C语言有读取一个字符的函数:

1
int fgetc( FILE * fp );

fgetc()函数从fp所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回EOF

fgetc() 用法举例

1
2
3
4
// 读取文件单个字符
char ch;
FILE *fp = fopen("filename", "r"); // 注意直接填文件名是相对路径
ch = fgetc(fp);

同样地,也有读取一个字符串的函数:

1
char *fgets( char *buf, int n, FILE *fp );

fgets()函数从fp所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区buf,并在最后追加一个null字符来终止字符串。

fgets() 用法举例

1
2
3
4
5
// 利用fgets()实现按行读取文本文件内容
#define MAX_LINE 1024
char str[MAX_LINE];
FILE *fp = fopen("filename", "r"); // 注意直接填文件名是相对路径
fgets(str, MAX_LINE, fp);

fprintf()自然就也还有fscanf()函数,它用于格式化读取文件内容:

1
int fscanf ( FILE *fp, char * format, ... );

同样它也只需要指定文件指针,然后和scanf()函数没有多大差别。

1
2
3
4
5
// 格式化读取文件内容
FILE *fp;
int i;
char *str;
fscanf(fp, "%d %s", &i, str);

0x04 实例

描述

尝试编写一个程式,输入学号、姓名以及科目成绩保存至文件中,之后按行读取数据并保存至相应变量中,再输出到屏幕上。

0x05 总结

以上是C语言中文件操作的一些基础用法,当然,这篇教程只是抛砖引玉,还有像fwrite()fread()的函数没有介绍,上面的例子也只是一个模板,方法不限,能够实现功能即可(当然代码越漂亮越好,因为之后的大作业也会遇到= =

0%