C语言之文件操作
文件的打开和关闭
文件再读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,再打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定使用fopen函数来打开文件,使用fclose来关闭文件。
FILE * fopen(const char * filename, const char * mode);//mode是打开方式
int fclose (FILE * stream);
打开方式如下:
文件使用方式 | 含义 | 如果指定文件不存在 |
“r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输入数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 出错 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建立一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb++”(读写) | 为了读和写打开一个二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
文件打开
#include<stdio.h> int main() { //打开文件test.txt //相对路径(即相对于当前的代码在哪个路径底下) //..表示上一级路径 //. 表示当前路径 //fopen("../test.txt","r"); //fopen("../../test.txt","r"); //fopen("test.txt","r"); //绝对路径的写法 //fopen("D:\\vs\code\\101\\C语言-文件操作\\C-文件操作(1)-22-12-1\\test.txt", "r"); return 0; }
“r”
#include<stdio.h> #include<errno.h> #include<string.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { { printf("%s", strerror(errno)); return 0; } } //来到这里就说明打开成功了 //读文件 //关闭文件 fclose(pf);//pf的类型就是FILE* //fclose就是把文件关闭掉,把FILE这个结构体所指向的文件关闭掉,把这个资源释放掉 //但是此时pf并没有置成空指针,对于fclose(pf)属于值传递,并没有改变pf //所以我们就需要把pf置成空指针 pf = NULL; return 0; }
我们发现其实并没有成功打开文件,原因就是No such file or directory,即没有这个文件或者文件夹。
我们在前面的表格中可以知道,"r"(只读)如果指定文件不存在的话会出错。
所以我们需要创建test.txt文件之后再来运行程序:
此时我们来运行程序:
屏幕上什么都没有显示就说明打开文件成功了。
“w”
我们先把刚刚创建的test.txt文件删除掉。
因为如果以"w"(只写)的方式来打开文件时,如果指定文件不存在,会新建一个文件。
现在用只写的方式来打开文件:
说明程序打开成功了,我们再来看一看到底有没有创建test.txt文件。
这里的确创建了一个新的文件,在这个路径底下就自动生成test.txt文件。
注意有一个小细节
现在我们给test.txt文件中放入"abcdef",即:
现在我们来运行程序:
当我们再次查看test.txt文件时发现文件是空的。
那为什么会出现这种情况呢?原因是:我们通过"w"(只写)来打开文件时,会新建一个文件出来,那么旧的那个、先前的那个文件里的内容就销毁掉了。即指定的文件存在与否都会新建一个文件。
文件的顺序读写
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二级制输出 | fwrite | 文件 |
字符输入输出函数fgetc和fputc
fputc
#include<stdio.h> #include<string.h> #include<errno.h> int main() { FILE* pfwrite = fopen("test.txt", "w");//pfwrite所指向的流是文件输出流,即我们要向文件里面写东西 if (pfwrite == NULL) { printf("%s\n", strerror(errno)); } //写文件 fputc('h', pfwrite); fputc('e', pfwrite); fputc('l', pfwrite); fputc('l', pfwrite); fputc('o', pfwrite); //关闭文件 fclose(pfwrite); pfwrite = NULL; return 0; }