第十章:文件

第十章:文件

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);
    
  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛰伏GR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值