第十章:文件

news/2025/2/22 22:48:24/

文章目录

    • 第十章:文件
      • 10.1-文件概述
        • 文件
        • 流与缓冲
        • 缓冲区
      • 10.2-文件类型指针
      • 10.3-文件的打开与关闭
        • 文件打开函数fopen()
        • 文件关闭函数fclose()
      • 10.4-文件的顺序读写
        • 单个字符读写函数
          • `fgetc()、fputc()`
        • 数据块读写函数(二进制方式)
          • `fread()`
          • `fwrite()`
        • 格式化读写函数
          • fprintf()
          • fscanf()
        • 字符串读写函数
          • `fgets()`
          • `fputs()`
        • 其他读写函数
          • `putw()`
          • `getw()`
      • 10.4-文件的随机读写
          • `rewind()`
          • `fseek()`
          • `ftell()`-->取文件指针当前位置
      • 10.5-文件读写的出错检测
          • 文件读写错误检测函数`ferror()`
          • 清楚文件错误标志函数 `clearerr()`
          • 文件删除函数 `remove()`
      • 10.6-补充函数
          • `itos()`
          • `stoi()`

第十章:文件

10.1-文件概述

文件
  • 定义:指存储在外部介质(如此盘磁带)上数据的集合,是操作系统数据管理的单位(文件名)

  • 程序文件:.c 、.obj 、.exe

  • 数据文件:文件内容是供程序运行时读写的数据

  • C语言中的文件

    • 为了简化操作,不同硬件设备被看作一个文件。对于这些文件的操作,等同于对磁盘上普通文件的操作。
    • 键盘:输入文件,scanf就是从这个文件获取数据
    • 显示器:输出文件,printf就是向这个文件输出
  • C语言在 stdio.h 文件中定义了3个标准文件在这里插入图片描述

  • 文件的分类:根据数据的组织形式

    • ASCII文件(文本文件):以字符形式存储数据文件

    • 二进制文件(映像文件):以二进制形式存储数据的文件称为二进制文件,它是按照数据在内存中的存储形式原样存储数据的

      整数10000->'1' '0' '0' '0' '0'->00110001 00110000 00110000 00110000 00110000

      在这里插入图片描述

  • ASCII文件与二进制文件的区别

    • ASCII文件:便于字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间
    • 二进制文件:可以节省外存空间和转换时间,但一个字符并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上,以后又需要输入内存的,常用二进制文件保存
流与缓冲
  • 流:数据在数据源和程序(内存)之间传递的过程叫做流。

  • 输入流:数据从数据源复制到程序(内存)的过程叫做输入流

  • 输出流:从程序(内存)保存到文件的过程叫做输出流

  • 打开文件就是打开了一个流

  • 流的格式:文本流和二进制流

    • 文本流是一种字符序列,通常是一行行的字符,换行符表示一行的结束。在这里插入图片描述

    • 二进制流是一种字节序列,它与外设中的字节序列是一一对应的。在这里插入图片描述

  • 说明:

    • C语言把文件看作是一个有序的字节流(字符流或二进制流)
    • C语言中,对数据的存取是以字节为单位
缓冲区
  • 在向文件写数据时,是先将数据送到缓冲区,待缓冲区充满后才正式输出到文件。如果当数据未充满缓冲区而程序结束运行,就会出现将缓冲区中的数据丢失,或者损坏文件
  • 用fclose()关闭文件,它先将缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量,切断由fopen()所建立起来的文件指针与文件名之间的联系,供其它文件使用,并清除掉缓冲区残留的数据。

在这里插入图片描述

10.2-文件类型指针

  • 对文件进行读写需要知道:文件名字、文件状态、当前位置、缓冲区等有关信息等

  • 系统为每个正在使用的文件开辟一个相应的文件信息区,用来存放文件的有关信息。这些信息保存在有关结构类型的变量中。

  • FILE是定义在头文件stdio.h中的文件结构体

  • stdio.h 文件中有以下的文件类型声明:

    typedef structshort level;*缓冲区”满”或”空”的程度*unsigned flags;*文件状态标志*char fd;*文件描述符*unsigned char hold;*如无缓冲区不读取字符*short bsize;*缓冲区的大小*unsigned char *buffer; /*数据缓冲区的位置*/unsigned char *curp; /*指针,当前的指向*/unsigned istemp; /*临时文件,指示器*/short token; /*用于有效性检查*/
    }FILE; 
    
  • 文件结构类型在打开文件时由系统自动建立,当用户使用文件时不用重复定义

  • 在C程序中,如果要对已经打开的文件进行操作,必须通过指向该文件结构的指针,所以需要定义文件类型指针变量。如:FILE *fp;

  • fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件

  • 所谓打开文件,指为文件建立相应的信息区(用来存放文件名、文件状态、当前读写位置等相关信息),和文件缓冲区(用来暂存输入输出的数据)

  • 关闭文件撤销文件信息区和文件缓冲区,使指针变量不再指向该文件,也就无法进行文件的读写。

10.3-文件的打开与关闭

在这里插入图片描述
在这里插入图片描述

文件打开函数fopen()
  • 调用方式:

    fopen(文件名,使用文件方式);FILE*fp; //定义一个指向文件的指针变量fp
    fp=fopen(″a1″,″r″);	//将fopen函数的返回值赋给指针变量fp
    
  • 文件打开方式:在这里插入图片描述

  • 函数的功能及返回值

    • 功能:按指定的文件使用方式打开指定文件
    • 调用成功:返回打开文件的文件结构变量的地址
    • 不成功:返回NULL(0),即指定文件无法打开
     FILE *fp;fp = fopen( “c:\\data\\test.dat”,“rb”); //按二进制方式进行读操作if(fp==NULL){  printf("文件打开失败");exit(0); /*头文件:stdlib.h*/}
    
文件关闭函数fclose()
  • 关闭文件:使文件的指针变量不再指向该文件

  • fclose()原型:

    int fclose(FILE *fp);//*fp是指向被关闭文件的指针变量
    
  • 返回值:

    • 调用成功,返回0
    • 不成功,返回EOF(-1)

10.4-文件的顺序读写

  • 文件顺序读写指按数据先后次序进行读写,每读写一次后,文件指针自动指向下一读写位置。<stdio.h>
单个字符读写函数
fgetc()、fputc()

在这里插入图片描述

数据块读写函数(二进制方式)
fread()
  • fread() 函数从文件中读入一个数据块,以二进制形式读

  • 定义形式:

    fread(buffer, size, count, fp);buffer:用来存放从文件读入的数据的存储区的起始地址
    size:要读写的字节数
    count:要读写多少个数据项(每个数据项长度位size)
    fp:FILE类型指针
    eg:
    float f[10];
    fread(f,4,10,fp);//从fp所指向的文件读入10个4个字节的数据,存储到数组f中
    
fwrite()
  • fwrite() 函数向文件写一个数据块,以二进制形式写

  • 定义形式:

    fwrite(buffer, size, count, fp);buffer:是把此地址开始的存储区中的数据向文件输出
    
格式化读写函数
  • fprintf和fscanf函数的读写对象不是终端而是文件
fprintf()
  • 定义形式:

    fprintf(文件指针,格式化字符串,输出表列);fprintf(fp,"%d,%6.2f",i,f);//将int型变量i和float型变量f的值按%d和%6.2f的格式输出到fp指向的文件中
    
fscanf()
  • 定义形式:

    fscanf(文件指针,格式化字符串,输入地址表列);fscanf(fp,"%d,%f",&i,&f);//磁盘文件上如果有字符"3,4.5",则从中读取整数3送给整形变量i,读取实数4.5送给float型变量f
    

注意:用fprintf和fscanf函数对磁盘文件读写时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。

字符串读写函数
fgets()
  • 定义:

    fgets(str,n,fp);
  • 功能:从fp指向的文件读入一个长度为(n-1)的字符串,存放在字符数组str中

  • 返回值:读成功,返回地址str,失败则返回NULL

fputs()
  • 定义:

    fputs(str, fp);
    
  • 功能:把str所指向的字符串写到文件指针变量fp所指向的文件中

  • 返回值:输出成功,返回0;失败则返回非0值

其他读写函数
putw()
  • 原型:
int putw(int i,FILE *fp);
  • 功能:将整型量i写入fp指向的文件
  • 返回值:返回所写的值
getw()
  • 原型

    int getw(FILE *fp);
    
  • 功能:从流中取一整数,并适当增大文件的位置指示器(从磁盘读入一个整数到内存)。由于读取数值时可能会有数值等于EOF的数,必须使用feof( )、ferror( )确定是否读到文件结束标志或出现错误。

putw()、getw()并非ANSIC标准定义的函数,多数C编译都提供这两个函数,但函数名不同

10.4-文件的随机读写

  • 随机读写:读写完上一个字符(字节)后,并不一定要读写其后续的字符,而可以读些文件中任意位置上所需要的字符。

  • C语言提供了文件定位操作函数实现文件的随机读写。

rewind()
  • 原型: rewind(文件指针);
  • 功能:使文件位置标记重新返回文件的开头,此函数无返回值
fseek()
  • 原型:

    fseek(文件指针类型,位移量,起始点);起始点:用0、1、2代替,"0"代表"文件开始位置;"1"代表"当前位置";"2"代表"文件末尾位置"
    位移量:指以起始点为基点,向前移动的字节数(长整型)eg:
    fseek (fp,100L,0);  //将文件位置标记向前移到离文件开头100个字节处
    fseek (fp,50L,1);   //将文件位置标记向前移到离当前位置50个字节处
    fseek (fp,-10L,2);  //将文件位置标记从文件末尾处向后退10个字节
    
  • 函数功能:改变文件标记位置,一般用于二进制文件

ftell()–>取文件指针当前位置
  • 原型:

    long ftell(FILE *fp);
    
  • 功能:获取流式文件中的当前位置,用相对于文件开头位移量表示

  • 返回值:文件位置指示器的位移量()相当于文件头;错误时返回-1L

10.5-文件读写的出错检测

文件读写错误检测函数ferror()
  • 原型:

    int ferror(FILE *fp);
    
  • 调用形式:

    ferror(fp);if (!ferror(fp)){  printf("Error reading from my2.txt.\n");clearerr(fp);     }
    
  • 功能:检测文件读写是否正确

  • 返回值:返回0,表示未出错;返回非0,表示出错

  • 注意:对同一文件,每次调用输入输出函数,都会产生一个新的ferror()函数值,所以,应当调用一个输入输出函数后立即检查该函数的值,否则就会丢失该信息值。在执行fopen函数时,ferror函数的初始值自动置为0

清楚文件错误标志函数 clearerr()
  • 原型:

    void clearerr(FILE *fp);
    
  • 功能:使文件错误标志和文件结束标志置0

  • 调用形式:

    clearerr(fp);
    
  • 在调用一个输入输出函数时若出错误,则错误标志一直保留,直到对同一文件调用clearerr( )或rewind( )或其他输入输出函数

文件删除函数 remove()
  • 原型:

    int remove(char *fname);
    
  • 功能:删除fname所指定的文件

  • 若文件已打开,则必须将该文件关闭才能够删除,调用成功,返回0;否则返回-1,并置全局变量errno为ENOENT(无此文件或目录)或EACCES(无此权限)

10.6-补充函数

itos()
  • 功能:用函数完成将一个整数转换成字符串(如483→”483”)

  • 函数原型:

    void itos(int number, char *str);
    
stoi()
  • 功能:用函数完成将一个字符串转换成整数(”483”→483)

  • 函数原型:

    int stoi(char *str);
    

http://www.ppmy.cn/news/1395937.html

相关文章

【编译tingsboard】出现gradle-maven-plugin:1.0.11:invoke (default)

出现的错误&#xff1a; [ERROR] Failed to execute goal org.thingsboard:gradle-maven-plugin:1.0.11:invoke (default) on project http: Execution default of goal org.thingsboard:gradle-maven-plugin:1.0.11:invoke failed: Plugin org.thingsboard:gradle-maven-plugi…

「10」文本(GDI+):添加文字,可设置背景添加移动效果

「10」文本&#xff08;GDI&#xff09;添加文字&#xff0c;可设置背景添加移动效果 在OBS软件里&#xff0c;通过来源组件「文本&#xff08;GDI&#xff09;」&#xff0c;您可以添加任意您想要呈现的文字&#xff0c;在直播窗口中显示&#xff0c;它可以是提示语、广告词、…

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…

云数据库认识

云数据库概述 说明云数据库厂商概述Amazon 云数据库产品Google 的云数据库产品Microsoft 的云数据库产品 云数据库系统架构UMP 系统概述UMP 系统架构MnesiaRabbitMQZooKeeperLVSController 服务器Proxy 服务器Agent 服务器日志分析服务器 UMP 系统功能容灾 读写分离分库分表资源…

【OceanBase】V3.1.5 版本备份恢复

日志备份 启动日志归档 ALTER SYSTEM ARCHIVELOG;查看日志归档状态 SELECT * FROM CDB_OB_BACKUP_ARCHIVELOG;停止日志归档 ALTER SYSTEM NOARCHIVELOG;数据备份 发起转储 -- 发起转储 ALTER SYSTEM MAJOR FREEZE;-- 查看转储进度 SELECT * FROM oceanbase.__all_zone WH…

Spring Boot | SpringBoo“开发入门“

目录 : 1.SpringBoot的“介绍”SpringBoot”概述” &#xff1a;SpringBoot”简介“SpringBoot的“优点” 2. SpringBoot入门程序环境准备使用 “Maven”方式构建SpringBoot 项目使用“Spring Initializr”方式构建Spring Boot 项目 3. “单元测试” 和“热部署”单元测试热部署…

考研复习时间表(3-4月)(待完善)

周一至周三 总体复习时间表 复习科目复习时间早上英语单词&#xff08;半小时&#xff0c;10分钟预习&#xff0c;20分钟复习&#xff09;9:00-9:30英语语法&#xff08;2小时&#xff0c;倍速1小时&#xff09;9:30-11:00数学课&#xff08;1小时&#xff0c;倍速40分钟&#…

mysql 设置初始密码

link 1.首先输入以下指令&#xff1a; sudo cat /etc/mysql/debian.cnf运行截图如下&#xff1a; 2. 再输入以下指令&#xff1a; mysql -u debian-sys-maint -p//注意! //这条指令的密码输入是输入第一条指令获得的信息中的 password ZCt7QB7d8O3rFKQZ 得来。//请根据自己的实…