第八章 文件操作

该文章内容整理自《C程序设计(第四版)》、《高质量C编程指南》、以及网上各大博客

文件主要包含两种,程序文件和数据文件。程序文件的内容是程序代码。数据文件是供程序运行时读写的数据。根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。数据在内存中是以二进制形式存储则为二进制文件,此时也可以认为是存储在内存的数据的映像,因而也称之为映像文件。若以ASCII码形式存储,则称为ASCII码文件,又称文本文件,需要再存储前进行转换,每个字节存放一个字符的ASCII码

对于程序中每个正在使用的文件,系统都会开辟一个在外存和程序数据区之间的文件缓冲区。除此之外,还会在内存开辟一个文件信息区,用以存放文件的有关信息,称为文件指针,是类型名为FILE的结构体。

文件打开和关闭

  1. fopen。调用方式为fopen(文件名, 使用文件方式);用来打开数据文件。文件使用方式选项如下。当文件不能打开时,则会返回空指针NULL
    file1file2
    程序中可以使用3个标准的流文件:标准输入流、标准输出流、标准出错输出流。标准输入流是从终端的输入,标准输出流是向终端的输出,标准出错输出流是当程序出错时将出错信息发送到终端。在程序开始运行时系统会自动打开这3个文件而不需要再用fopen打开
  2. fclose。调用方式为fclose(文件指针);用来关闭数据文件。在处理完缓冲区的数据后撤销文件信息区和文件缓冲区。当成功关闭文件则返回0,否则返回EOF,也即-1

文件顺序读写

  1. fgetc。调用方式为fgetc(fp);用来从文件读入一个字符。读取成功则返回读取字符,否则返回EOF
  2. fputc。调用方式为fputc(c, fp);用来将字符写到文件中。输出成功则返回输出字符,否则返回EOF
  3. fgets。调用方式为fgets(str, n, fp);用来从文件中读入n-1个字符长的字符串并存放在字符数组str中。若在读完n-1个字符之前遇到换行符’\n’或者文件结束符EOF则结束读入,同时把’\n’也当成一个字符读入。读成功则返回地址str,否则返回NULL
  4. fputs。调用方式为fputs(str, fp);用来把str中的字符串写到文件中。此时字符串结尾的’\0’不输入。输出成功则返回0,否则返回非0值
  5. fscanf。调用方式为fscanf(文件指针, 格式字符串, 输出表列);用来从文件中格式地读入数据。
  6. fprintf。调用方式为fprintf(文件指针, 格式字符串, 输入表列);用来格式地将数据写到文件。
  7. fread。调用方式为fread(buffer, size, count, fp);用来从文件中读一个数据块。
  8. fwrite。调用方式为fwrite(buffer, size, count, fp);用来向文件写一个数据块。其中,buffer是指要读写的数据存储区的地址,size是指要读写的每个数据项的字节数,count是指要读写多少个数据项。fread和fwrite函数只能处理二进制文件

文件随机读写

文件位置标记用来指示接下来要读写的一个字符的位置。只要控制文件位置标记就能实现随机读写

  1. rewind。调用方式为rewind(fp);用来使文件位置标记指向文件开头。没有返回值
  2. fseek。调用方式为fseek(文件类型指针, 位移量, 起始点);用于移动文件位置标记。一般用于二进制文件。其中,位移量是指以起始点为基点向前移动的字节数,为long型数据。起始点用0、1、2表示,具体意义如下
    fseek
  3. ftell。调用方式为ftell(fp);用来得到流式文件中文件位置标记,用相对于文件开头的位移量表示,否则返回-1L

文件读写出错检测

  1. ferror。调用方式为ferror(fp);每次对同一个文件调用输入输出函数时都会产生一个新的ferror值,此时应立即使用ferror函数检查
  2. clearerr。调用方式为clearerr(fp);若在调用一个输入输出函数时出现错误,ferror值为一个非零值,此时应立即调用clearerr清零