C语言文件操作
磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
文件的打开和关闭
文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
我们一般都是通过一个FILE的指针来维护这个FILE结构的变量。
FILE* pf;
定义pf是一个指向FILE类型数据的指针变量。

文件打开与关闭
fopen 是打开文件
FILE * fopen ( const char * filename, const char * mode );
fclose为关闭文件
int fclose ( FILE * stream );
我们需要知道文件的使用方式
| 文件使用方式 | 含义 |
|---|---|
| "r"只读 | 为了输入数据,打开一个已经存在的文本文件 |
| "w"只写 | 为了输出数据,打开一个文本文件 |
| "a"追加 | 向文本文件尾添加数据 |
| “rb”(只读) | 为了输入数据,打开一个二进制文件 |
| “wb”(只写) | 为了输出数据,打开一个二进制文件 |
| “ab”(追加) | 向一个二进制文件尾添加数据 |
| “r+”(读写) | 为了读和写,打开一个文本文件 |
| “w+”(读写) | 为了读和写,建议一个新的文件 |
| “a+”(读写) | 打开一个文件,在文件尾进行读写 |
| “rb+”(读写) | 为了读和写打开一个二进制文件 |
| “wb+”(读写) | 为了读和写,新建一个新的二进制文件 |
| “ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 |
int main()
{
//打开文件
FILE* pf = fopen("test.txt","w");
//判断
if(pf == NULL)
{
perror("fopen");
return;
}
//文件关闭
fclose(pf);
pf = NULL;
return 0;
}
文件的顺序读写
| 字符 | 功能 | 适用于 |
|---|---|---|
| fgetc | 字符输入函数 | 所有输入流 |
| fputc | 字符输出函数 | 所有输入流 |
| fgets | 文本行输入函数 | 所有输入流 |
| fputs | 文本行输出函数 | 所有输入流 |
| fscanf | 格式化输入函数 | 所有输入流 |
| fprintf | 格式化输出函数 | 所有输入流 |
| fread | 二进制输入 | 文件 |
| fwrite | 二进制输出 | 文件 |
对比一组函数
scanf/fscanf/sscanf
scanf:按照一定的格式从键盘输入数据
fscanf: 按照一定的格式从输入流(文件/stdin)输入数据
sscanf
int sscanf ( const char* s , const char * format, …);
printf/fprintf/sprintf
printf:按照一定的格式把数据打印(输出)到屏幕上
fprintf:按照一定的格式向输出流(文件/stdout)输出数据
sprintf
int sprintf(char* str , const char* format , …);
struct S
{
char name[10];
int age;
float score;
}
int main()
{
char buf[100] = { 0 };
struct S tmp = { 0 };
struct S s= {"mingzi",22,91.5f};
//将结构体的数据转换成字符串
sprintf(buf,"%s %d %f",s.name, s.age,s.score);
//将buf中的字符串,还原成一个结构体数据
sscanf(buf, "%s %d %f",tmp.name,&(tmp.age),&(tmp.score));
return 0;
}
sscanf:从字符串中按照一定的格式读取出格式化的数据。
sprintf:把格式化的数据按照一定的格式转换成字符串。
文件读取结束的判定
feof
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
fgetc
如果读取正常,会返回读取到的字符ASCII值
如果读取失败,返回EOF
fgets
如果读取正常,返回的是存放读取到的数据的地址
如果读取失败,返回NULL
fscanf
如果读取正常,返回的是格式串中指定的数据的个数
如果读取失败,返回的是小于格式串中指定的数据的个数
本文深入解析C语言中文件操作,涵盖文件分类、文件指针、不同模式下的文件打开与关闭、常见输入输出函数如fgetc/fputc/fgets/fputs等的使用,以及feof的正确判断。带你全面掌握文件操作技巧。

被折叠的 条评论
为什么被折叠?



