第十章 对文件的输入与输出

  1. 10.1 C文件的有关基本知识
    1. 10.1.1 文件和文件名
      1. 1.在程序设计中主要分为:程序文件、数据文件。
      2. 2.操作系统把各种设备都统一当作文件来处理,每个与主机相连接的输入输出设备都看作一个文件。“文件”一般指存储在外部介质上数据的集合;文件统一由操作系统来管理。
      3. 3.“流”(Stream):是一个传输通道,输入输出统称为“数据流”;c语言把文件看作是由一个一个字符(字节)数据顺序组成的序列,对文件的存取是以字节为单位的。
    2. 10.1.2 文件的分类
        1. 数据文件可分为:ASCII文件和二进制文件
      1. 2.数据文件在内存中是以二进制形式存储的,如果输出时不加转换输出到外存,就是二进制文件(映像文件);如果以ASCII码形式存储则需要转换,ASCII文件又称为文本文件,每个ASCII码字符占一字节
      2. 3.数据在磁盘上的存储形式:① 字符统一用ASCII码形式存放,数值型数据既可以用ASCII码形式也可以用二进制形式存放;② 如果整数10000,以ASCII码形式存放到磁盘,则占5字节(一字符占一个字节),而用二进制形式,则在磁盘占4字节
    3. 10.1.3 文件缓冲区
      1. 1.“缓冲文件系统”处理数据:是指系统自动地在内存区为程序中每个正在使用的文件开辟一个文件缓冲区。① 从内存向磁盘输出数据必须先将其送到内存缓冲区,装满缓冲区后再一起送到磁盘;② 从磁盘读入数据到计算机,将数据输入先到缓冲区(充满后),再从缓冲区逐个地将数据送到程序数据区(给变量)。
        1. 注意 :每个文件在内存中只有一个缓冲区。
    4. 10.1.4 文件类型指针
        1. 简称“文件指针”,每个被使用的文件都在内存中开辟一个相应的文件信息区(结构体变量形式),存放文件的有关信息,该结构体类型由系统进行声明,名字为FILE。可以直接使用FILE 定义变量。
      1. 2.一般不通过FILE 类型的变量名来引用这些变量,而是定义一个指向FILE类型的指针变量,通过它来引用这些变量。
  2. 10.2 打开与关闭文件
    1. “打开”:是指为文件建立相应的信息区(存放文件信息)和文件缓冲区(存放输入输出数据)。
    2. 10.2.1 用fopen函数打开数据文件
      1. 1 . 函数的调用方式:fopen ( 文件名, 使用文件的方式);例如 :fopen (“a1”, “r” ); //表示要打开的文件名为a1,使用文件的方式为“读入”,该函数的返回值是指向a1文件的指针(即a1文件信息区的起始地址)。通常将fopen函数返回值赋给一个指向文件的指针变量。
        1. 使用文件的基本方式:① “r”:文件向计算机输入(读入)数据,并且该文件已经存在,存有数据。② “w” :只能用于从计算机向文件写入数据(输出)。③ “a”: 表示 向文件末尾添加新的数据(不希望删除原有数据),要求该文件已经存在。④ “r+,w+,a+”: 既可用来输入数据又可用来输出数据。⑤ 在“r, w, a”后加一个“b”表示以二进制形式,rb :打开一个二进制文件输入数据。
        1. 注意: 向文件写入数据(输出)的数据形式是由程序中采用的读写语句决定的,例如:fscanf,fprint :是按ASCII码形式进行输入输出;fread,fwrite 函数是按二进制形式进行输入输出。
    3. 10.2.2 用fclose函数关闭数据文件
      1. “关闭文件”就是使文件指针变量不在指向该文件;格式:fclose(文件指针)。
      2. 该函数会带回返回值,当成功执行关闭操作,则返回0,否则返回EOF(-1)文件读写位置标记。
  3. 10.3 顺序读写文件

    1. 10.3.1 怎样向文件读写字符
      1. (1)读入(输入):fgetc 函数, fgetc(文件指针fp):从fp所指向的文件读入一个字符;返回值:读成功,返回所读的字符,失败则返回文件结束标志EOF(-1)
      2. (2)写入(输出):fputc 函数,fputc(ch, 文件指针fp): 把字符ch写入到文件指针变量fp所指向的文件中;返回值:输出成功,返回值就是输出的字符,否则返回文件结束标志EOF(-1)。
      3. (3)说明:① 在文件的末尾有一个文件尾标志,当写完全部字符后文件读写位置就指向文件最后一个字符的末尾(文件尾标志);文件尾标志用EOF标识,在stdlib.h中被定义为-1。② feof函数可以用来检测文件尾标志是否被读过,如果已被读取,函数feof函数值就为真(1),否则为假。
    2. 10.3.2 怎样向文件读写一个字符串
      1. (1)函数:fgets 和 fputs ,一次读写一个字符串。
      2. (2)① fgets(str,n ,fp); 作用:从文件指针fp所指向的 文件中读入一个长度为n-1的字符串,存放到字符数组str中;返回值:读成功返回str地址值,失败返回NULL。② fputs(str , fp); 作用:把str所指向的字符串写入到fp所指向的文件中;返回值:输出成功,返回0,否则返回非0.
      3. (3)说明:如果在读完n-1个字符前遇到换行符或EOF,就结束读入但是将所遇到的换行符“\n”也读入。fputs函数中,第一个字符串可以是字符串常量,字符数组名或字符指针。字符串末尾的\0不输出。
    3. 10.3.3 用格式化的方式读写一个字符串

      1. (1)函数:格式化读(输入):fscanf,格式化写:fprint.
        1. 2. 2)① **fprint(文件指针,格式字符串, 输出表列)** ;例 `fprint(fp, "%d,%f", i,f );` //作用:将变量i和f的值按%d,%f的格式输出到fp所指向的文件中。②** fscanf( 文件指针,格式字符串, 输入表列)**,例 :fscanf( fp,"%d,%f", &i,&f); //从fp所指向的文件上读取对应类型的数到变量i和变量f中去。但由于输入输出时需要进行字符与二进制的转换,使用较少。
    4. 10.3.4 用二进制方式向文件读写一组数据

      1. (1)fread 函数:从文件中读一个数据块,fwrite 函数:向文件写一个数据块;在读写时是以二进制形式进行的,读写不需要进行转换。
      2. (2)调用形式:fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); //其中 buffer:是一个地址值(起始地址),分别是 :前者 从文件读入的数据的存储区的地址(内存中), 后者 把以此地址开始的存储区的数据向文件输出;size 要读的字节数(每个数据项的长度);count 要读的数据项个数;fp 文件指针。例 :fread( f,4,10,fp); //从fp所指向的文件中读入10个4字节大小的数据存到数组f。
  4. 10.4 随机读写数据文件
    1. 10.4.1 文件位置标记及其定位
        1. 文件位置标记(文件标记):作用:用来指示“接下来要读写的下一个字符的位置”。一般读写前指向文件开头。
        1. 文件位置标记的定位:采用强制文件位置标志指向人们指定的位置,(1)rewind函数:使文件位置标记指向文件的开头,函数无返回值。(2)fseek函数:改变文件位置标记;调用:fseek(文件类型指针, 位移量,起始点) ;起始点: 0表示文件开始位置,1 表示当前位置,2 表示文件末尾位置。位移量:指以起始点为基点,向前移动的字节数,long型。例: fseek(fp,10L,0); //将文件位置标记向前移动离当前10个字节处;fseek(fp,-10L,2);//将文件位置标记从文件末尾向后退10字节。 (3)ftell函数:测定文件位置标记的当前位置;如果调用函数出错则返回-1.
  5. 10.5 文件读写的出错检测
      1. 检查输入输出函数调用时可能出现的错误
    1. 2.1ferror 函数ferror(fp) ; 返回值为0表示未出错,返回值为非零则出错;每次调用该函数均会产生一个新的函数值。
    2. 2.2 clearerr函数clearerr(fp); 作用是让文件结束标志和出错标志置0。