C语言——文件操作

article/2025/10/11 19:33:33

文章目录

  • 1. 为什么使用文件
  • 2. 什么是文件
    • 2.1 程序文件
    • 2.2 数据文件
    • 2.3 文件名
  • 3. 文件的打开和关闭
    • 3.1 文件指针
    • 3.2 文件的打开和关闭
  • 4. 文件的顺序读写
    • 4.1 fgetc与fputc
    • 4.2 fgets与fputs
    • 4.3 fscant与fprintf
      • 4.3.1 fprintf
      • 4.3.2 fscanf
    • 4.4 fread与fwrite
      • 4.4.1 fwrite
      • 4.4.2 fread
    • 4.5 对比scanf/fscanf/sscanf与printf/fprintf/sprintf
      • 4.5.1 fprintf
      • 4.5.2 sscanf
  • 5. 文件的随机读写
    • 5.1 fseek
    • 5.2 ftell
    • 5.3 rewind
  • 6. 文本文件和二进制文件
  • 7. 文件读取结束的判定
  • 8. 文件缓冲区
  • 9. 总结

1. 为什么使用文件

  我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,这样根本没有实用性。我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

2. 什么是文件

  磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的,本次讲解的是数据文件。

2.1 程序文件

  包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

2.2 数据文件

  文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

2.3 文件名

  一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀例如: c:\code\test.txt为了方便起见,文件标识常被称为文件名。

3. 文件的打开和关闭

3.1 文件指针

  缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结体类型是由系统声明的,取名FILE。
  每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

  定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

3.2 文件的打开和关闭

  文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

//打开文件
FILE*fopen ( constchar*filename, constchar*mode );
//关闭文件
int fclose ( FILE*stream );

打开方式如下:
在这里插入图片描述

4. 文件的顺序读写

在这里插入图片描述

4.1 fgetc与fputc

  我们来简单的介绍一下它们的使用方式:
在这里插入图片描述
  这是运行之前,下面来看运行之后。
在这里插入图片描述
  我们会发现在该文件路径下会生成一个test.dat,并且里面还有我们写进去的三个字符。这是fputc的功能,往文件中写入一个字符,接下来让我们看看fgetc,从文件中读取一个字符到屏幕上。
在这里插入图片描述

4.2 fgets与fputs

  上面是一次只能读写一个字符,接下来我们来看一次能读写一个字符串的。fputs就是一个一次能往文件中写一个字符出的函数,让我们来看看它简单使用。
在这里插入图片描述
  既然有写那么就会有读,那就让我们来看看读又是什么样的呢?
在这里插入图片描述  这就是读取的文件数据的操作了,值得一说的是中间的参数3,实际只会读取俩个字符,还有一个字符是’\0’。

4.3 fscant与fprintf

4.3.1 fprintf

  这两个函数与scanf与printf极其相似,使用也是十分相似,一个是从键盘输入和输出到屏幕,一个是输入到文件和从文件中读取,那就让我们具体来看看吧。
  fprintf是往文件中输出,函数原型:int fprintf( FILE *stream, const char *format [, argument ]…);第一个参数就是我们要写入的文件指针,后面的参数就与printf一样的,我们需要写入的参数,这里拿结构体来进行举例。
在这里插入图片描述

4.3.2 fscanf

  相应的fscanf就是从文件中读取数据,函数原型:int fscanf( FILE *stream, const char *format [, argument ]… )。
在这里插入图片描述

4.4 fread与fwrite

4.4.1 fwrite

  这个是以二进制的形式存储数据,也就是当我们从文件中看的时候是看不懂的,函数原型:size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );第一个参数是所需要存储数据的地址,第二个是一个元素的大小,第三个参数是元素的个数,第四个就是我们要存入的文件指针,举个例子:
在这里插入图片描述

4.4.2 fread

  我们会发现除了名字其他的数据我们都看不懂,原因是这种写法是以二级制的形式存储数据的,而字符的二进制形式就是它本身,因此我们只能看懂字符,而看不懂其他的数据。我们再来看看读取的操作,先看函数原型 size_t fread( void *buffer, size_t size, size_t count, FILE *stream );,再来看操作:
在这里插入图片描述

4.5 对比scanf/fscanf/sscanf与printf/fprintf/sprintf

  关于scanf、printf与fscanf、fprintf在前面已经讲解过了,这里重点讲一下sscanf与sprintf的作用。

4.5.1 fprintf

  它的作用是将一个格式化的数据写入到字符串中,先来看函数原型:int sprintf( char *buffer, const char *format [, argument] … );第一个参数是字符串的地址,后续参数与printf函数一样。
在这里插入图片描述  虽然输出看起来像结构体,实际它是存放在字符串中的。

4.5.2 sscanf

  它的作用与sprintf相反,是将字符串中的数据还原为原有的格式,函数原型:int sscanf( const char *buffer, const char *format [, argument ] … );如图:
在这里插入图片描述  此时是以结构体的形式输出的。

5. 文件的随机读写

5.1 fseek

  作用:根据文件指针的位置和偏移量来定位指针,函数原型:int fseek( FILE *stream, long offset, int origin );第一个参数是要操作的文件指针,第二个参数是相对于起始位置的偏移量,第三个是从哪里开始。第三个参数包括:SEEK_CUR(从当前位置开始)、SEEK_END(从文件结束开始)、SEEK_SET从文件开头开始,这有什么用呢?举个例子:在这里插入图片描述
  先在文件中存放abcd四个字符。
在这里插入图片描述  这时候我们的fseek就派上用场了,我们来看操作。
在这里插入图片描述
  我们会发现发生了改变,这就是fseek的作用,它可以改变文件指针所指向的位置,其他两个参数也是如此。

5.2 ftell

  返回文件指针相对于起始位置的偏移量。函数原型:long int ftell ( FILE * stream );
在这里插入图片描述  可以结合fseek使用,一个是计算相对于其实位置的偏移量,一个是通过偏移量来更改文件指针的指向。

5.3 rewind

  让文件指针的位置回到文件的起始位置。函数原型:void rewind ( FILE * stream );
在这里插入图片描述

6. 文本文件和二进制文件

  根据数据的组织形式,数据文件被称为文本文件或者二进制文件。数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
  一个数据在内存中是怎么存储的呢?
  字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。
在这里插入图片描述

7. 文件读取结束的判定

  牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

  1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
    例如:
    fgetc 判断是否为 EOF .
    fgets 判断返回值是否为 NULL .
  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
    例如:
    fread判断返回值是否小于实际要读的个数。
int main(void)
{int c; // 注意:int,非char,要求处理EOFFILE* fp = fopen("test.txt", "r");if(!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环{ putchar(c);}//判断是什么原因结束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}

8. 文件缓冲区

  ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

在这里插入图片描述

9. 总结

  本期关于结构体相关的知识就到此结束啦,本期内容不经常使用,如果大家想理解的透彻,建议大家可以多次观看进行理解,再做一些题来进行巩固,在此希望大家都能有所进步喔。
  如果觉得本篇文章讲的不错,可以给一个赞来鼓励博主嗷,如果大家有什么看不懂的地方或者发现其中的错误可以在评论区留言或者私信我嗷,那么本期就到此结束,让我们下期再见。


http://chatgpt.dhexx.cn/article/UN6sZgac.shtml

相关文章

C语言之文件操作

目录 为什么使用文件 文件名 文件指针 流 文件的打开和关闭 前言 文件的打开方式 文件打开关闭函数 fopen函数 fclose函数 文件的顺序读写 fputc函数 fgetc函数 fputs函数 fgets函数 fprintf函数 fscanf函数 fwrite函数 fread函数 文件的随机读写 fseek函…

文件操作(图解)

文件操作 1、文件是什么?1.1 程序文件1.2 数据文件1.3 文件名 2、文件的打开和关闭2.1 文件指针2.2 文件的打开和关闭 3、文件的顺序读写4、文件的随机读写4.1 fseek4.2 ftell4.3 rewind 5、文本文件和二进制文件6、文件读取结束的判定6.1 被错误使用的feof 7、文件…

C++中的文件操作

目录 文件操作C中的文件操作时基于面向对象的C中文件类型分为两种:操作文件的三大类(这些类都属于标准模板库):1 文本文件1.1 写文件写文件步骤如下:文件打开方式: 1.2 读文件读取文件数据的四种方式按照喜好记前三个中…

什么是文件操作?为什么要有文件操作?

文章目录 前言一、什么是文件1.1 程序文件1.2 数据文件 二、文件的打开与关闭2.1 文件指针2.2 文件的打开与关闭2.3 文件读写详情表!(重点)2.4 文件的顺序读写!(重点)2.5 文件的随机读写2.5.1 fseek2.5.2 f…

常见文件操作函数

目录 一、文件的打开和关闭 1、文件指针 2、文件打开和关闭 二、文件的顺序读写 1、fgetc()和fputc()函数 2、fgets()和fputs()函数 3、fscanf()和fprintf()函数 4、fread()和fwrite()函数 三、文件的随机读写 1、fseek函数 2、ftell函数 3、rewind函数 四、文本文…

【Linux】Linux的文件操作

文件操作对于不少编程初学者来说都是一件头疼的事情,不管你学习的是什么编程语言,C/C/Java/Go/Python ,因为我们学习到的文件相关的操作对你来说都是一个黑盒,我们只是知道我们应该怎么使用相应的文件函数进行操作,而对于内部的实…

文件操作(详解)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 ​ 3.2 文件的打开和关闭 4. 文件的顺序读写 4.1 对比一组函数: 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind 7. 文件读取结束的…

c语言中的文件操作

目录 引入: 一、文件的打开和关闭 1.文件名 2.文件指针 3.文件的打开和关闭 二、对文件如何操作和流 1.对文件操作相关功能: 2.流 三、文件操作函数(顺序读写) 1."w"输出流: 2."r" 输入流 3."wb"与&…

C语言 文件操作

文件操作在我们的使用中虽然占的不多,但是有些时候,还是需要这部分的知识的。比如,我们做了一个C语言版的售卖系统。现在的想法是在关闭的时候保存这次的结果,然后下一次继续使用,这个时候,就可以使用文件操…

手把手教你学Python之文件操作(一文掌握文件操作)

目录 1、Python中文本文件的读写 2、Python中常用的文件与文件夹操作方法 3、Python中Excel文件的读写 4、Python读取Excel文件案例​ 为了保存数据,方便修改和分享,数据通常以文件的形式存储在磁盘等外部存储介质中。根据逻辑上编码不同可将文件大致…

Linux文件操作

目录 一、系统api与库函数的关系二、open和close函数介绍2.1 open方法介绍2.2 close方法介绍 三、open/create函数创建文件时的权限设置四、read和write函数的介绍和使用4.1 read函数介绍4.2 write函数介绍4.3 如何使用 五、lseek函数的介绍和使用5.1 介绍5.2 如何使用 六、阻塞…

python文件操作(一看就懂)

python文件操作 历史遗留问题文件介绍打开文件转定义字符Python格式化字符串的替代符以及含义Python的转义字符及其含义 💕Final~ 历史遗留问题 现在我们接着上文讲,如果没有看过我上篇文章的萌新朋友们可以先去看看,不然一会儿容易读的你满…

Linux的文件操作命令

接下来将介绍Linux中一些常用的文件操作命令,今天先演示五个类型的命令操作,内容不是特别的全,找的几个典型的常用的演示,想要全面的可以另找资料了解一下,推荐大家跟着敲跟着做才能加深记忆,祝大家学的开心…

Linux —— 文件操作

目录 1.内核提供的文件系统调用 1.1open和close 1.2标记位 1.3write和read 2.文件描述 2.1文件描述符 2.2文件描述符分配规则 3.重定向 3.1最“挫”的重定向 3.2使用系统调用 3.3重定向原理 3.4让我们的"shell"支持重定向操作 4.一切皆文件 5.缓冲区 5…

文件操作详解

1.文件的概念 文件的基本概念   所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁…

文件操作(C语言)

目录 一、前言 二、文件的打开和关闭 三、文件的读写 1.文件的顺序读写 2.文件的随机读写 四、文件结束的判定 一、前言 当我们向写好的通讯录程序中输入信息时,有时我们希望能保存输入的信息,不用每次打开这个程序都要重新输入,这时就…

文件操作详解(超级详细)

正常我们的程序在执行的时候程序结束后,会将所有数据清楚,那么我们应该如何保存数据呢?这里我们就需要用文件操作。 一、文件的打开和关闭 1.文件打开、关闭函数—fopen、fclose //打开文件 FILE * pf fopen ( const char * filename, const…

虚拟机安装黑苹果【虚拟机安装,黑苹果安装,黑苹果无法全屏问题】(这应该全网最全的资源了吧~)

一,资源下载 链接:https://pan.baidu.com/s/1cyGiDvkJinx8dnB57gO7UQ 提取码:i615 PS:里面有虚拟机资源,Drawin.ios文件和苹果镜像文件 这里只讲如何用虚拟机安装黑苹果,不讲如何安装虚拟机,下…

VMware虚拟机安装黑苹果10.15 || AMD R7 5800处理器

VMwar版本:16Pro 链接:https://pan.baidu.com/s/1qGHEynWSV4YS9WSNonxiuA?pwdazvh 提取码:azvh macOS链接,版本为Catalina 10.5。这个版本后,os安装包就过10G了,会特别卡。 链接:https://pan…

VMware16安装macOS10.15.1 - 黑苹果 - osx虚拟机

效果图 步骤 下载安装VMware,并且利用unlocker开启macos的支持VMware利用unlocker开启MacOS支持_Rudon滨海渔村的博客-CSDN博客效果步骤下载安装vmware16http://www.winwin7.com/soft/17946.html下载unlocker3.0 (这里包括了darwin.iso和darwinPre15.is…