前言
被要求写的教程,直接删了感觉可惜,毕竟百度写了那么久,当作备忘录要用的时候看看吧。
0x00 打开文件
我们通常使用fopen()
函数来打开/创建一个文件,函数原型如下:
1 | FILE *fopen( const char * filename, const char * mode ); |
其中的filename为需要打开/新建的文件的名称,mode为打开的模式,具体描述如下:
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
1 | "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b" |
另外函数返回值FILE*为文件指针,通常又称为文件句柄,我们进行其他文件操作时它通常作一个起标记作用的参数。
fopen() 用法举例
1 | // 桌面生成 test.txt |
0x01 关闭文件
打开一个文件后顺便书写关闭文件的代码是一个好习惯。关闭文件的函数为fclose()
,函数原型如下:
1 | int fclose( FILE *fp ); |
如果成功关闭文件,fclose( )函数返回零,如果关闭文件时发生错误,函数返回EOF。
PS:EOF(end of file) 为文件结束符,在C语言中其值通常为-1
(具体值还要看编译器
细心的同学可能注意到了,之前的例子没有关闭文件,在这里我们给它加上去:
1 | // 桌面生成 test.txt |
在了解了打开和关闭文件之后,我们文件读写大致的框架已经有了,接下来只需要学习在打开文件和关闭文件之间的事情:写入文件和读取文件。
方便起见,之后的例子就不再把代码完整写一遍了。
0x02 写入文件
fputc()
函数可以向文件中写入一个字符,其函数原型如下:
1 | int fputc( int c, FILE *fp ); |
其中fp就是打开文件之后返回的文件指针,c为需要写入字符的ascii值。
fputc() 用法举例
1 | // 将字符写入文件 |
一次写一个字符似乎不太方便,而用循环解决感觉不是很优雅,fputs()
用于向文件中写入一个字符串,可以解决我们的问题:
1 | int fputs( const char *s, FILE *fp ); |
fp依旧是你打开文件的文件指针,s为需要写入的字符串。
fputs() 用法举例
1 | // 将字符串写入文件 |
另外还有fprint()
函数,看上去和printf()
函数很像,确实如此,它只比printf()
多了一个文件指针参数:
1 | cint fprintf ( FILE *fp, char * format, ... ); |
指定你需要写入的文件的句柄,你就能像使用printf()
函数一样向文件里写入内容了。
fprintf() 用法举例
1 | // 格式化写入文件 |
0x03 读取文件
同样地,C语言有读取一个字符的函数:
1 | int fgetc( FILE * fp ); |
fgetc()
函数从fp所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回EOF。
fgetc() 用法举例
1 | // 读取文件单个字符 |
同样地,也有读取一个字符串的函数:
1 | char *fgets( char *buf, int n, FILE *fp ); |
fgets()
函数从fp所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区buf,并在最后追加一个null字符来终止字符串。
fgets() 用法举例
1 | // 利用fgets()实现按行读取文本文件内容 |
有fprintf()
自然就也还有fscanf()
函数,它用于格式化读取文件内容:
1 | int fscanf ( FILE *fp, char * format, ... ); |
同样它也只需要指定文件指针,然后和scanf()
函数没有多大差别。
1 | // 格式化读取文件内容 |
0x04 实例
描述
尝试编写一个程式,输入学号、姓名以及科目成绩保存至文件中,之后按行读取数据并保存至相应变量中,再输出到屏幕上。
0x05 总结
以上是C语言中文件操作的一些基础用法,当然,这篇教程只是抛砖引玉,还有像fwrite()
和fread()
的函数没有介绍,上面的例子也只是一个模板,方法不限,能够实现功能即可(当然代码越漂亮越好,因为之后的大作业也会遇到= =