文件IO: 从入门到精通(一)

目录

介绍

打开文件

读写文件

fgetc() 和 fputc()

fgets() 和 fputs()

fread() 和 fwrite()

缓冲机制

关闭文件

总结

介绍

C语言提供了一套强大而灵活的文件IO库,允许你在程序中读取和写入文件。文件IO是许多应用程序的关键组成部分,包括文本处理、配置文件读写、数据存储等等。

两种文件操作方式:既可以使用由操作系统直接提供的系统调用函数接口,也可以使用标准C库提供的库函数调用。

在系统调用和C库中,都有一组函数专门用于文件操作的:比如打开文件、关闭文件、读写文件。如果是系统调用----文件IO(系统IO);如果是库函数调用---标准IO。

本文将介绍C语言中标准文件IO(库函数调用)的基本概念和操作,并附带代码示例。

打开文件

在C语言中,要操作一个文件,首先需要打开它。你可以使用fopen函数来打开一个文件。

函数原型

FILE *fopen(const char *pathname, const char *mode);

参数

const char *pathname:指针,字符串的首地址,即将打开的文件名(路径)的文件,字符串表示文件

const char *mode:指针,字符串首地址,字符串表示打开的方式

"r":只读打开文本文件,在文件开始位置进行操作

"r+":读写打开文本文件,在文件开始位置进行操作

"w":只写方式打开文本文件,如果打开文件存在则清空文件,文件不存在则创建文件,在文件开始位置进行操作

"w+":读写方式打开文本文件,如果打开文件存在则清空文件,文件不存在则创建文件,在文件开始位置进行操作

"a":追加写打开本文文件,如果文件不存在就创建,在文件末尾进行操作(定位到文件末尾)

"a+":读追加打开文本文件,如果文件不存在就创建,写在文件末尾进行操作

返回值

FILE *    成功:返回文件指针,打开的文件

失败:NULL

返回的文件指针,是一种FILE结构体的地址(指向FILE类型的指针),FILE结构体就描述打开文件的各种信息。下面是一个示例:

#include <stdio.h>

int main()
{
    FILE * fd;//声明一个文件指针
    fd = fopen("data.txt","r");//以只读的方式打开data.txt文件
    if(fd == NULL)//判断是否为空,为空表示打开失败
    {
        printf("文件打开失败\n");
    }

    fclose(fd);//关闭文件
    
}

上面的代码使用fopen函数以只读方式打开一个名为"data.txt"的文件。如果文件打开成功,fopen将返回一个指向FILE结构的指针,否则返回NULL

在程序执行时,默认会为当前程序打开三个文件:

设备

文件指针

标准输入(键盘)

FILE * stdin

标准输出(终端显示)

FILE * stdout

标准出错输出(终端显示)

FILE * stderr

读写文件

标准IO函数,读写接口非常多:

第一组:每次一个字符的读写标准IO函数接口:fgetc() 和 fputc()

第二组:每次一行的读写标准IO函数:fgets() 和 fputs()

第三组:每次读写若干数据块的标准IO函数:fread() 和 fwrite()

注意:文件io的读写函数每一组都是相互匹配的,不能混用。

fgetc() 和 fputc()

功能

获取指定文件中的一个字符

函数原型

int fgetc(FILE *stream);

参数

FILE *stream:文件指针,指定读取字符的文件

返回值

成功:读取到的字符(以int类型返回)

失败:EOF

备注

EOF表示读取到文件末尾或者是读取错误失败

功能

将一个字符写入指定的文件

函数原型

int fputc(int c, FILE *stream);

参数

参数1:字符

          int c:要写入的字符

参数2:文件指针

          FILE *stream:要写入的文件

返回值

成功:返回写入的字符的值

失败:返回EOF

下面是一个示例:

#include <stdio.h>

int main()
{
    
  
    fputc('a',stdout);//将字符a写入终端文件中
    
    char c;
    c = fgetc(stdin);//从键盘文件中获取一个字符
    printf("%c\n",c);
}

上面的代码使用fputc()将一个字符写入终端文件中等价于printf(),fgetc()从从键盘文件中读取数据,等价于scanf()。

fgets() 和 fputs()

功能

从指定文件中读取最多一行数据

函数原型

char *fgets(char *s, int size, FILE *stream);

参数

参数1:

        char * s:自定义读取数据的存储空间首地址(从文件中读取的数据存储的地址)

参数2:

        int size:自定义空间的存储空间大小

参数3:

       FILE *stream:即将读取数据的文件指针(从哪个文件中读取)

返回值

成功:返回存储空间首地址s

失败:返回NULL

备注

fgets:由于s首地址存在一段空间,读取存储时不能超过这个空间大小,最多读取size-1

size-1 < 一行====>size-1

size-1 > 一行====>一行

会在读取完的下一个位置添加'\0'

失败NULL:读取错误失败或 当前读取已经在文件末尾读取不到数据

功能

将数据写入指定文件

头文件

#include <stdio.h>

函数原型

int fputs(const char *s, FILE *stream);

参数

参数1:

       const char * s:自定义写入数据,把s首地址的数据写入文件

参数2:

        FILE * stream:文件指针,要写入的文件

返回值

成功:返回非负整数

失败:EOF

备注

s是首地址,把s首地址开始的每一个字符写入文件,s字符串的字符直到为'\0'

下面是一个示例:

#include <stdio.h>

int main()
{
   
    char buf[20];
    
    fgets(buf,sizeof(buf),stdin);//从键盘文件中读取数据,等价于scanf()
   

    fputs(buf,sizeof(buf),stdout);//将数据写入终端文件中,等价于printf()  
    printf("%s\n",buf);
}

上面的代码使用fputs()将字符串数据写入终端文件中等价于printf(),fgetc()从从键盘文件中读取数据,等价于scanf()。

fread() 和 fwrite()

功能

从指定文件中读取若干个数据块

函数原型

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数

参数1:

        void *ptr:指针,读取数据存放的首地址(自定义的存储位置)

参数2:

        size_t size:整数,要读取每个数据块的大小

参数3:

        size_t nmemb:整数,读取的数据块的个数

参数4:

        FILE *stream:即将被读取数据的文件的文件指针

返回值

成功:读取的数据块的个数

失败:返回0

备注

失败:当前读取已经读取到文件末尾或者读取错误

功能

将若干块数据写入指定的文件

函数原型

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

参数

参数1:

        const void *ptr:指针,要写入的内容数据首地址(把ptr地址中的数据写入文件)

参数2:

        size_t size:整数,要写入每个数据块的大小

参数3:

        size_t nmemb:整数,写入的数据块的个数

参数4:

        FILE *stream:写入的文件的文件指针

返回值

成功:返回写入的数据块的个数

失败:返回0

因为fread、fwrite是严格按照数据块和数据块大小来处理,而不会对数据格式做处理,数据中的特殊字符'\0','\n'不会受到影响,可以用于二进制文件操作。

缓冲机制

标准IO的缓冲机制:

使用标准IO读写操作,在打开文件时会创建缓冲区,用于读写文件

读:从内核中读取一段数据到缓冲区,应用程序读操作就从缓冲区中读取

写:写入文件时,先把数据写入缓冲区,当缓冲区满足一定条件,才会写入文件

三种缓冲机制:

无缓冲-----stderr

行缓冲:只要在缓冲区遇到 '\n',把缓冲区数据刷新到文件-----stdin、stdout

全缓冲:只要缓冲区满,把缓冲区数据刷新到文件----其他用标准io打开的文件

需要注意的是,如果程序正常退出,缓冲区中的数据通常会被自动刷新。但是,如果程序异常终止,可能会导致缓冲区中的数据丢失。因此,在重要数据的情况下,最好手动刷新缓冲或使用 fflush() 来确保数据写入文件。

关闭文件

无论是读取还是写入文件,在完成操作后都应该关闭文件,以释放资源并确保文件的完整性。使用fclose函数来关闭文件,如上述示例中所示。

总结

文件IO是C语言编程中非常重要的一部分,本文介绍了如何打开、读取和写入文件,以及如何关闭文件。通过这些基本操作,你可以进行更复杂的文件处理,例如配置文件解析、日志记录和数据存储等任务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值