C语言详解 FILE文件操作

C语言详解 FILE文件操作1 需要了解的概念需要理解的知识点包括 数据流 缓冲区 文件类型 文件存取方式 1 1 数据流 指程序与数据的交互是以流的形式进行的 进行 C 语言文件的存取时 都会先进行 打开文件 操作 这个操作就是在打开数据流 而 关闭文件 操作就是关闭数据流 1 2 缓冲区 Buffer 指在程序执行时 所提供的额外内存 可用来暂时存放做准备执行的数据 它的设置是为了提高存取效率 因为

1. 需要了解的概念

1.1 数据流:

指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。

1.2 缓冲区(Buffer):

指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。

C语言详解 FILE文件操作 C语言中带缓冲区的文件处理:

C语言的文件处理功能依据系统是否设置“缓冲区”分为两种:一种是设置缓冲区,另一种是不设置缓冲区。由于不设置缓冲区的文件处理方式,必须使用较低级的I/O函数(包含在头文件io.h和fcntl.h中)来直接对磁盘存取,这种方式的存取速度慢,并且由于不是C的标准函数,跨平台操作时容易出问题。下面只介绍第一种处理方式,即设置缓冲区的文件处理方式:

当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据,如下图所示:

C语言详解 FILE文件操作

事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示。

C语言详解 FILE文件操作

分为文本文件和二进制文件两种。

文本文件是以字符编码的方式进行保存的。二进制文件将内存中数据原封不至文件中,适用于非字符为主的数据。如果以记事本打开,只会看到一堆乱码。

1.4 文件存取方式:

包括顺序存取方式和随机存取方式两种。

顺序读取也就是从上往下,一笔一笔读取文件的内容。保存数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件,而被存取的文件则称为顺序文件。

2.1 打开文件

函数原型为:_CRTIMP FILE * __cdecl fopen(const char *, const char *);

第一参数为文件名,第二个参数为打开模式。

打开成功,fopen返回一个结构指针地址,否则返回一个NULL。如果没有指定文件路径,则默认为当前工作目录。如:

 

C语言详解 FILE文件操作  谈文件打开模式

打开文本文件:

“r”:只能从文件中读数据,该文件必须先存在,否则打开失败
“w”:只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
“a”:向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
“r+”:可读/写数据,该文件必须先存在,否则打开失败
“w+”:可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
“a+”:可读/写数据,原来的文件不被删去,位置指针移到文件末尾

打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母’b’,以表示以二进制形式打开文件。
 











2.2 关闭文件

函数原型为:_CRTIMP int __cdecl fclose(FILE *);

关闭成功返回值0,否则返回非零值。

注:在执行完文件的操作后,要进行“关闭文件”操作。虽然程序在结束前会自动关闭所有的打开文件,但文件打开过多会导致系统运行缓慢,这时就要自行手动关闭不再使用的文件,来提高系统整体的执行效率。

 

例1. 打开文件并进行判断和关闭文件

 

 

 

2.3 字符存取函数

函数原型为:

字符读取函数fgetc()可从文件数据流中一次读取一个字符,然后读取光标移动到下一个字符,并逐步将文件的内容读出。

如果字符读取成功,则返回所读取的字符,否则返回EOF(end of file)。EOF是表示数据结尾的常量,真值为-1。另外,要判断文件是否读取完毕,可利用feof()进行检查。未完返回0,已完返回非零值。

feof()函数原型为:_CRTIMP int __cdecl feof(FILE *);

例2. fgetc()函数的使用

版本1:利用feof()函数检查文件是否读取完毕

 

#include 

main()
{

    FILE *fp;
    fp = fopen(“c:\\temp\\test.txt”, “r”);
    if(fp != NULL)
    {

        while( ! feof(fp))
            printf(“%c”, fgetc(fp));
    }
    else
        printf(“fail to open! \n”);
    fclose(fp);

    return 0;
}
















 

 

#include 

main()
{

    char ch;
    FILE *fp;
    fp = fopen(“c:\\temp\\test.txt”, “r”);
    if(fp != NULL)
    {

        ch = fgetc(fp);
        while(ch != EOF)
        {

            putchar(ch);
            ch = fgetc(fp);
        }

    }
    else
        printf(“fail to open! \n”);
    fclose(fp);

    return 0;
}






















 

 

#include 

main()
{

    char ch;
    FILE *fp;
    if((fp = fopen(“test.txt”, “r”)) != NULL)
        while((ch = fgetc(fp)) != EOF)
            putchar(ch);
    else
        printf(“fail to open! \n”);
    fclose(fp);

    return 0;
}














 

 

#include 

main()
{

    FILE *fp;
    if((fp = fopen(“test.txt”, “r”)) != NULL)
        while(fgetc(fp) != EOF)
            putchar(fgetc(fp));
    else
        printf(“fail to open! \n”);
    fclose(fp);

    return 0;
}













 

例3. fputc()函数的使用

 

#include 


#include 

main()
{

    char filename[20], ch;
    FILE *fp;
    printf(“Enter a filename: “);
    scanf(“%s”, filename);
    printf(“Enter some characters to output to file: “);
    if((fp = fopen(filename, “w”)) == NULL)
        printf(“fail to open! \n”);
    else
    {

        while((ch = getche()) != ‘\015’)
            fputc(ch, fp);
    }
    fclose(fp);

    return 0;
}





















 

2.4 字符串存取函数

函数原型为:

fgets函数的作用是从指定文件读入一个字符串,如:fgets(str, n, fp);

参数n为要求得到的字符个数,但只从fp指向的文件输入n-1个字符,然后在最后加一个’\0’字符,因此得到的字符串共有n个字符,把它们放在字符数组str中。如果在读完n-1个字符之前遇到换行符或EOF,读入结束。

fputs函数的作用是向指定文件输出一个字符串,如:fputs(“Hey”, fp);

把字符串”Hey”输出到fp指向的文件。fputs函数的第一个参数可以是字符串常量、字符数组名或字符型指针。若输出成功,则返回0,否则返回EOF。

实例略

 

2.5 格式化存取函数

函数原型为:

它们与printf和scanf函数相仿,都是格式化读写函数。不同的是:fprintf和fscanf函数的读写对象不是终端(标准输入输出),而是磁盘文件。printf函数是将内容输出到终端(屏幕),因此,fprintf就是将内容输出到磁盘文件了。

实例4. fprintf和fscanf函数的使用

 

#include 

void main()
{

    FILE *fp;

    int num = 10;
    char name[10] = “Leeming”;
    char gender = ‘M’;

    if((fp = fopen(“info.txt”, “w+”)) == NULL)
        printf(“can’t open the file! \n”);
    else
        fprintf(fp, “%d, %s, %c”, num, name, gender); //将数据格式化输出到文件info.txt中

    fscanf(fp, “%d, %s, %c”, &num, name, &gender); //从文件info.txt中格式化读取数据
    printf(“%d, %s, %c \n”, num, name, gender); //格式化输出到屏幕

    fclose(fp);
}



















 

2.6 指针重返函数

函数原型为:

_CRTIMP void __cdecl rewind(FILE *);;

rewind函数的作用是使位置指针重返回文件的开头,属于文件的定位。

 

3. 二进制文件操作

3.1 数据块存取函数

函数原型:

当要求一次存取一组数据(如,一个数组、一个结构体变量的值),fread和fwrite函数可以解决该类问题。它们的调用形式一般为:

实例5. fread和fwrite函数的使用

 

#include 


#define SIZE 3

typedef enum { MM, GG } Gender;

typedef struct
{

    char name[10];
    int  age;
    Gender gender;
} Person;

void write2file(Person emp[SIZE])
{

    FILE *fp;
    if((fp = fopen(“emp.txt”, “wb”)) == NULL)
    {

        printf(“cannot open file! \n”);
        return;
    }

    for(int i=0; i
        if(fwrite(&emp[i], sizeof(Person), 1, fp) != 1)

            printf(“file write error! \n”);
    fclose(fp);
}

void read_from_file(FILE *fp)
{

    Person emp_out[SIZE];

    if((fp = fopen(“emp.txt”, “rb”)) == NULL)
    {

        printf(“cannot open file! \n”);
        return;
    }

    printf(“\n%d employee’s information read: \n”, SIZE);

    for(int i=0; i
    {


        if(fread(&emp_out[i], sizeof(Person), 1, fp) != 1)
            if(feof(fp))
            {

                fclose(fp);
                return;
            }
            printf(“%-5s %4d %5d \n”, emp_out[i].name, emp_out[i].age, emp_out[i].gender);
    }
    fclose(fp);
}

void main()
{

    FILE *fp = NULL;
    Person employee[SIZE];

    printf(“Enter %d employee’s information: \n”, SIZE);
    for(int i=0; i
        scanf(“%s %d %d”, employee[i].name, &employee[i].age, &employee[i].gender);

    write2file(employee);

    read_from_file(fp);
}
































































 

3.2 随机存取函数fseek()

函数原型:

_CRTIMP int __cdecl fseek(FILE *, long, int);

对流式文件可以进行顺序读写,也可以进行随机读写。关键在于控制文件的位置指针,如果位置指针是按字节位置顺序移动的,就是顺序读写。如果能将位置指针按需要移动到任意位置,就可以实现随机读写。所谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。该函数的调用形式为:

fseek(fp, offset, start);

start:起始点。用0、1、2代替。0代表文件开始,名字为SEEK_SET,1代表当前位置,名字为SEEK_CUR,2代表文件末尾,名字为SEEK_END。

fseek()函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱。

调用实例如:

fseek(fp, i*sizeof(Person), 0);

 

https://blog.csdn.net/yong_sun/article/details/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224921.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午10:50
下一篇 2026年3月17日 上午10:50


相关推荐

  • 20191207-CHKDSK命令修复磁盘教程「建议收藏」

    20191207-CHKDSK命令修复磁盘教程「建议收藏」WIN7下的磁盘突然不能打开。在网上找DiskGenius,结果只能显示可以找到哪些文件,但是不能恢复文件!如果你想恢复文件,是要付费的!本来想找WINPE下的DiskGenius,想想还得准备1TB的移动硬盘呀!(1TB的磁盘出错了!)没有想到直接使用chkdsk几分钟就可以解决问题了!MicrosoftWindows[版本6.1.7601]版权所有(c)2009MicrosoftCorporation。保留所有权利。C:\User…

    2025年7月5日
    5
  • 图像修复

    图像修复转自 https blog csdn net moxibingdao article details 本文继去雨去雾去模糊篇和图像增强与图像恢复篇之后 继续盘点 CVPR2020 中低层图像处理技术 本篇聚焦于图像修复 ImageInpaint 示例如下图 图片来自 https sites google com site gachoncvip projects image inpainting 上图中被污损的图像 左 被修复为图像 中 右图为参

    2026年3月20日
    2
  • 智慧旅游大数据平台建设解决方案有哪些_智慧交通解决方案

    智慧旅游大数据平台建设解决方案有哪些_智慧交通解决方案202x年智慧旅游大数据平台建设解决方案(专业完整版).docx-Actionscript文档类资源-CSDN下载

    2025年5月28日
    8
  • 事情各大厂商在战场上布局

    事情各大厂商在战场上布局

    2022年1月3日
    62
  • mysql数据库备份操作

    mysql数据库备份操作1 mysqldump 命令备份数据在 MySQL 中提供了命令行导出数据库数据以及文件的一种方便的工具 mysqldump 我们可以通过命令行直接实现数据库内容的导出 dump 首先我们简单了解一下 mysqldump 命令用法 mysqldump uroot pdatabases 数据库 1 数据库 2 gt xxx sql2 mysqldump 常用操作示例 1 备份全部数据库的数据和结构 mysqldump uroot p A gt data mysqlDump mydb

    2026年3月16日
    6
  • pac模式与全局模式哪个好_ppp模式的优缺点

    pac模式与全局模式哪个好_ppp模式的优缺点众所周知,传统有一大弊端,即:只能使用全局模式,这样情况下,虽然可以加速国外网站,但打开国内网站速度会变慢;加速度不但支持全局模式,同时也支持PAC模式(智能分流,绕过中国大陆),这样情况下,既可以加速国外网站,也不会影响国内网站打开速度!温馨提示:安卓手机客户端、IOS客户端、MAC客户端均可根据自己实际使用需求,自由切换【PAC模式】或者【全局模式】,具体如何切换可查看相应客户端设置教程;…

    2022年10月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号