【C语言文件操作 】

本文深入解析C语言中文件操作,涵盖文件分类、文件指针、不同模式下的文件打开与关闭、常见输入输出函数如fgetc/fputc/fgets/fputs等的使用,以及feof的正确判断。带你全面掌握文件操作技巧。

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

如果读取正常,返回的是格式串中指定的数据的个数
如果读取失败,返回的是小于格式串中指定的数据的个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值