c语言教程第9章.ppt

上传人:max****ui 文档编号:8291569 上传时间:2020-03-28 格式:PPT 页数:44 大小:219.66KB
返回 下载 相关 举报
c语言教程第9章.ppt_第1页
第1页 / 共44页
c语言教程第9章.ppt_第2页
第2页 / 共44页
c语言教程第9章.ppt_第3页
第3页 / 共44页
点击查看更多>>
资源描述
第十三讲文件 C文件概述文件类型指针文件的打开与关闭文件的读写文件的定位出错的检测非缓冲文件系统文件输入输出小结 C文件概述 文件 file 一般指 存储在外部介质上数据的集合 数据是以文件的形式存放在外部介质 如磁盘 上的 操作系统是以文件为单位对数据进行管理的 也就是说 如果想找存在外部介质上的数据 必须先按文件名找到所指定的文件 然后再从该文件中读取数据 要向外部介质上存储数据也必须先建立一个文件 以文件名标识 才能向它输出数据 C语言把文件看作是一个字符 字节 的序列 即由一个一个字符 字节 的数据顺序组成 根据数据的组织形成 可分为ASCII文件和二进制文件 ASCII文件又称文本 text 文件 它的每一个字节放一个ASCII代码 代表一个字符 二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放 ASCII形式和二进制形式输出的不同 例 如果有一个整数10000 在内存中占2个字节 如果按ASCII形式输出 则占5个字节 而按二进制形式输出 在磁盘上只占2个字节 如下图所示 0010011100010000 0010011100010000 0011000100110000001100000011000000110000 ASCII形式 1 0 0 0 0 二进制形式 由前所述 一个C文件是一个字节流或二进制流 它把数据看作是一连串的字符 字节 而不考虑记录的界限 即C中文件并不是由记录 record 组成的 在C中对文件的存取是以字符 字节 为单位的 输入 输出数据流的开始和结束仅受程序控制而不受物理符号控制 我们把这种文件称为流式文件 流式文件的形式 文件的处理方法 旧C版本有两种对文件的处理方法 一 缓冲文件系统 数据程序区 输出文件缓冲区 输入文件缓冲区 输出 输入 输出 输入 磁盘 所谓缓冲文件系统是指 系统自动地在内存区为每一个正在使用的文件名开辟一个缓冲区 从内存向磁盘输出数据必须先送到内存中的缓冲区 装满缓冲区后才一起送到磁盘去 从磁盘向内存读入数据 也是一次从磁盘文件将一批数据输入到内存缓冲区 然后再从缓冲区逐个地将数据送到程序数据区 给程序变量 缓冲区的大小由各个具体的C版本确定 一般为512字节 二 非缓冲文件系统 所谓 非缓冲文件系统 是指系统不自动开辟确定大小的缓冲区 而由程序为每个文件设定缓冲区 在UNIX系统中 用缓冲文件系统来处理文本文件 用非缓冲文件系统处理二进制文件 用缓冲文件系统进行的输入 输出又称为高级输入 输出系统 用非缓冲文件系统进行的输入输出又称为低级输入 输出系统 T 只采用缓冲文件系统 即既用缓冲文件系统处理文本文件 也用它来处理二进制文件 文件类型指针 缓冲文件系统中 关键的概念是 文件指针 每个被使用的文件都在内存中开辟一个区域 用来存放文件的有关信息 如文件的名字 文件状态及文件当前位置等 这些信息是保存在一个结构体类型变量中的 该结构体类型由系统定义 取名为FILE 一般的C中 在stdio h文件中有以下的类型定义 typedefstruct int fd 文件号 int cleft 缓冲区中剩下的字符 int mode 文件操作模式 char nextc 下一个字符位置 char buff 文件缓冲区位置 FILE 有了FILE类型之后 可以用它来定义若干FILE类型的变量 以便存放若干个文件的信息 例如 可以定义文件型指针变量 如FILE fp fp是一个指向FILE类型结构体的指针变量 可以使fp指向一个文件的结构体变量 从而通过该结构体变量中的文件信息能够访问该文件 也就是说 通过文件指针变量能够找到与它相关的文件 如果有n个文件 一般应设n个指针 指向FILE类型结构体的指针变量 使它们分别指向n个文件 确切地说 指向该文件的信息结构体 以实现对文件的访问 文件的打开 fopen函数 与其它高级语言一样 对文件读写之前应该 打开 该文件 在使用结束之后应关闭该文件 fopen函数的调用方式为 FILE fp fp fopen 文件名 使用文件方式 例如 fp fopen A1 r 它表示 要打开名字为A1的文件 使用文件方式为 读入 fopen函数带回指向A1文件的指针并赋给fp 这样fp就和A1相联系了 或者说 fp指向A1文件 可以看出 在打开一个文件时 通知给编译系统以下三个信息 1 需要打开的文件名 也就是准备访问的文件的名字 2 使用文件的方式 读还是写等 3 让哪一个指针变量指向被打开的文件 文件使用方式含义 r 只读 为输入打开一个文本文件 w 只写 为输出打开一个文本文件 a 追加 向文本文件尾增加数据 rb 只读 为输入打开一个二进制文件 wb 只写 为输出打开一个二进制文件 ab 追加 向二进制文件尾增加数据 r 读写 为读 写打开一个文本文件 w 读写 为读 写建立一个新的文本文件 a 读写 为读 写打开一个文本文件 rb 读写 为读 写打开一个二进制文件 wb 读写 为读 写建立一个新的二进制文件 ab 读写 为读 写打开一个二进制文件 使用文件方式如下表 说明 1 用 r 方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据 而且该文件应该已经存在 否则出错 2 用 w 方式打开的方式只能用于向该文件写数据 而不能用来向计算机输入 如果原来不存在该文件 则在打开时新建立一个以指定名字命名的文件 如果原来已存在一个以该文件名命名的文件 则在打开时将该文件删去 然后重新建立一个新文件 3 如果希望向文件末尾添加新的数据 不希望删除原有数据 则应该用 a 方式打开 若该文件不存在 则先建立该文件 4 用 r w a 方式打开的文件可以用来输入和输出数据 5 如果不能实现 打开 的任务 fopen函数将会带回一个出错信息 出错的原因可能是 用 r 方式打开一个并不存在的文件 磁盘出故障 磁盘已满无法建立新文件等 此时fopen函数将带回一个空指针值NULL NULL在stdio h文件中已被定义为0 常用下面的方法打开一个文件 if fp fopen file1 r NULL printf cannotopenthisfile n exit 0 即先检查打开有否出错 如果有错就在终端上输出 cannotopenthisfile exit函数的作用是关闭所有文件 终止正调用的过程 待程序员检查出错误 修改后再运行 6 在读写文本文件时 将回车和换行符转换为一个换行符 在输出时把换行符转换成为回车和换行两个字符 二进制文件则不进行这种转换 在内存中的数据形式与输出到外部文件中的数据形式完全一至 一一对应 7 在程序开始运行时 系统自动打开三个标准文件 标准输入 标准输出 标准出错输出 通常这三个文件都与终端相联系 系统自动定义了三个文件指针stdin stdout和stderr 分别指向终端输入 终端输出和标准出错输出 也从终端输出 如果程序中指定要从要stdin所指的文件输入数据 就是指从终端键盘输入数据 文件的关闭 fclose函数 关闭 就是使文件指针变量不指向该文件 也就是文件指针变量与文件 脱钩 此后不能再通过该指针对其相连的文件进行读写操作 除非再次打开 使指针变量重新指向该文件 fclose函数调用的一般形式为 fclose 文件指针 例如 fclose fp 用fopen函数打开文件时所带回的指针赋给了fp 今把该文件关闭 应该养成在程序终止之前关闭所有使用的文件的习惯 如果不关闭文件将会丢失数据 fclose函数也带回一个值 当顺利地执行了关闭操作 则返回值为0 如果返值为非零值 则表示关闭时有错误 可以用ferror函数来测试 fputc函数和fgetc函数 也称putc函数和getc函数 一 fputc函数把一个字符写到磁盘文件上去 其一般形式为fputc ch fp 其中ch是要输出的字符 它可以是一个字符常量 也可以是一个字符变量 fp是文件指针变量 它从fopen函数得到返回值 fputc函数也带回一个值 如果输出成功则返回值就是输出的字符 如果输出失败 则返回一个EOF EOF是在stdio h文件中定义的符号常量 值为 1 二 fgetc函数从指定文件读入一个字符 该文件必须是以读或读写方式打开的 fgetc函数的调用形式为ch fgetc fp fp为文件型指针变量 ch为字符变量 fgetc函数带回一个字符 赋给ch 如果在执行fgetc读字符时遇到文件结束符 函数返回一个文件结束标志EOF 如果想从一个磁盘文件顺序读入所有字符并在屏幕上显示出来 可以 ch fgetc fp while ch EOF putchar ch ch fgetc fp TC提供一个feof函数来判断文件是否真的结束 如果是文件结束 函数feof fp 的值为1 真 否则为0 假 如果想顺序读入一个二进制文件中的数据 可以用 while feof fp c fgetc fp 注意 这种方法也适用于文本文件 例L9 1 从键盘输入一些字符 逐个把它们送到磁盘上去 直到输入一个 为止 例L9 2 文件复制 本程序是按文本文件方式处理的 也可以用此程序来复制一个二进制文件 只需将两个fopen函数中的 r 和 w 分别改为 rb 和 wb 即可 例L9 2 2 用命令行参数进行文件复制 可在DOS命令行状态下运行 相当于copy命令 fread函数和fwrite函数 用getc和putc函数可以用来读写文件中的一个字符 但是常常要求一次读入一组数据 例如 一个实数或一个结构体变量的值 ANSIC标准提出设置两个函数 fread和fwrite 用来读写一个数据块 它们的一般调用形式为 fread buffer size count fp fwrite buffer size count fp 其中 buffer 是一个指针 对fread来说 它是读入数据的存放地址 对fwrite来说 是要输出数据的地址 以上指的是起始地址 size 要读写的字节数 count 要进行读写多少个size字节的数据项 fp 文件型指针 如果文件以二进制形式打开 用fread和fwrite函数就可以读写任何类型的信息 如 fread f 4 2 fp 其中f是一个实型数组名 一个实型变量占4个字节 这个函数从fp所指向的文件读入2次 每次4个字节 数据 存储到数组f中 如果有一个如下的结构体类型 structstudent type charname 10 intnum intage charaddr 30 stud 40 每一个元素用一存放一个学生的数据 假设学生的数据已存放在磁盘文件中 可以用下面的for语句和fread函数读入40个学生的数据 for i 0 i 40 i fread 如果fread或fwrite调用成功 则函数返回值为count的值 即输入或输出数据项的完整个数 注意 fread和fwrite函数一般用于二进制文件的输入输出 因为它们是按数据块的长度来处理输入输出的 在字符发生转换的情况下很可能出现与原设想的情况不同 例题分析 例L9 3 从键盘输入n个学生的有关数据 然后把它们转存到磁盘文件上去 例L9 3 2 从文件中读所有学生的有关数据 显示在屏幕上 例L9 3 3 向文件中中追加学生数据 例L9 4统计文件中单词的个数 fgets函数和fputs函数fgets的作用是从指定文件读入一个字符串 如fgets str n fp 从fp指向的文件输入n 1个字符 并把它们放到字符数组str中 如果在读入n 1个字符结束之前遇到换行符或EOF 读入即结束 字符串读入后在最后加一个 0 字符 fgets函数返回值为str的首地址 fputs函数的作用是向指定的文件输出一个字符串 如fputs China fp 把字符中 China 输出到fp指向的文件 0 不输出 fputs函数中第一个参数可以是字符串常量 字符数组名或字符型指针 输出成功 函数值为0 失败时 为非零值 例L9 5 从键盘输入若干行字符串到文件 例L9 6 显示文件内容 例L9 7 改进L9 6为Type命令 fprintf函数和fscanf函数 fprintf函数 fscanf函数与printf函数 scanf函数作用相仿 都是格式化读写函数 只有一点不同 fprintf和fscanf函数的读写对象不是终端而是磁盘文件 一般调用方式为 fprintf 文件指针 格式字符串 输出表列 fscanf 文件指针 格式字符串 输入表列 例如 printf fp d 6 2f i t 它的作用是将整型变量I和实型变量t的值按 d和 6 2f的格式输出到fp指向的文件上 如果I 3 t 4 5 则输出到磁盘文件上的是以下的字符串 3 4 50 同样 用以下fscanf函数可以从磁盘文件上读入ASCII字符 fscanf fp d f 磁盘文件上如果有以下字符 3 4 5则将磁盘文件中的数据3送给变量I 4 5送给变量t 用fprintf和fscanf函数对磁盘文件读写 使用方便 容易理解 但由于在输入时要将ASCII码转换为二进制形式 在输出时又要将二进制形式转换成字符 花费时间比较多 因此 在内存与磁盘频繁交换数据的情况下 最好不用fprintf和fscanf函数 而用fread和fwrite函数 文件的定位 文件中有一个位置指针 指和当前读写的位置 如果顺序读写一个文件 每次读写完一个字符后 该位置指针自动移动指向下一个字符位置 如果想改变这样的规律 可以用有关函数 强制使位置指针指向其它指定的位置 rewind函数 rewind函数的作用是使位置指针重新返回文件的开头 此函数没有返回值 例L9 9 2 有一个磁盘文件 第一次使它显示在屏幕上 第二次把它复制到另一个文件中 9 9 3没有末尾符号 include stdio h main FILE fp1 fp2 fp1 fopen file1 c r fp2 fopen file2 c w while feof fp1 putchar getc fp1 rewind fp1 while feof p1 putc getc fp1 fp2 fclose fp1 fclose fp2 fseek函数和随机读写 对流式文件可以进行顺序读写 也可以进行随机读定 关键在于控制文件的位置指针 如果位置指针是按字节位置顺序移动的 就是顺序读写 如果可以将位置指针按需要移动到任意位置 就可以实现随机读写 所谓随机读写 是指读写完上一个字符 字节 后 并不一定要读写其后续的字符 字节 而可以读写文件中任意所需的字符 字节 用fseek函数可以实现改变文件的位置指针 fseek函数的调用形式为fseek 文件类型指针 位移量 起始点 起始点 用0 1或2代替 0代表 文件开始 1为 当前位置 2为 文件末尾 TC指定以下的名字 起始点名字用数字代表文件开始SEEK SET0文件当前位置SEEK CUR1文件末尾SEEK END2 位移量 指以 起始点 为基点 向前移动的字节数 一般要求位移量是long型数据 这样当文件的长度大开64K进不致出问题 Fseek函数一般用于二进制文 因为文本文要发生字符转换 计算位置时往往会发生混乱 调用fseek如下 fseek fp 100L 0 将位置指针到离文件头100个字节处fseek fp 50L 1 将位置指针移到当前位置50个字节处fseek fp 10L 2 将位置指针从文件末尾处后退10个字节 ftell函数 fetll函数的作用是得到流式文件中的当前位置 用相对而于文件开头的位置量来表示 由于文件中的位置指针经常移动 人们不容易辨清其当前位置 用ftell函数可以得到当前位置 如果ftell函数返回值为 1 表示出错 例如 i ftell fp if i 1 printf error n 变量i存放当前位置 如调用函数出错 如不存在此文件 则输出 error ferror函数 在调用各种输入输出函数 如putc getc fread fwrite等 时 如果出现错误 除了函数返回值有所反映外 还可以用ferror函数检查 它的一般调用形式为 ferror fp 如果ferror返回值为0 假 表示未出错 如果返回一个非零值 表示出错 应该注意 对周一个文件每一次调用输入输出函数 均产生一个新的ferror函数值 因此 应当在调用一个输入输出函数后立即检查ferror函数的值 否则信息会丢失 在执行fopen函数时 ferror函数的初始值自动置于0 例L9 9 4 chearerr函数 它的作用是使文件错误标志和文件结束标志置为0 假如在调用一个输入输出函数时出现错误 ferror函数值为一个非零值 在调用clearerr fp 后 ferror fp 的值变成0 只要出现错误标志 就一直保留 直到对同一文件调用clearerr函数或rewind函数 或任何它一个输入输出函数 或任何其它一个输入函数 非缓冲文件系统 缓冲输入输出系统又称高级磁盘输入输出系统 非缓冲输入输出系统又称为低级磁盘输入输出系统 系统不为这类文件自动提供文件缓冲区 程序设计必须自己设定一个缓冲区并考虑如何使用它们 非缓冲文件系统提供了一些输入输出函数 用于对这进行输入输出操作 缓冲文件系统 高级I O系统 是有文件指针的 通过文件指针访问文件 而非缓冲文件系统 低级磁盘I O系统 则没有文件型指针 不是靠文件指来访问文件 而是一个整数代表一个文件 相当于FORTRAN等语言的 文件号 这个整数称为 文件说明符 通过下面介绍的几个常用函数可以对这种方式有一大概的了解 open函数 用来打开一个非缓冲文件 它的一般形式为open 文件名 打开方式 打开方式指该文件打开后的工作方式 即读写方式 方式作用0只能读1只能写2可以读 写例如 open Li 1 0 打开一个名为 Li 1 的文件 只能用于输入 如果打开成功 open函数返回一个正整数 如果文件夹因故未能打开 则返回 1 open函数一般是这样使用的 设fd已定义为整形变量 if fd open A 1 1 printf cannotopenfile n exit 0 如果要打开的文件不存在 多数 编译按 打开失败 处理 不产生新的文件 但有的编译可以用open函数建立一个新文件 例如 上面的打开操作中 如果原来磁盘上不存在一个名为 A 的文件 则open函数建立一个为 A 的文件 可供写数据 另一些C编译系统则只能用creat函数建立一个新文件 close函数 用来关闭已打开的文件 其调用形式为close fd fd为整型变量 它是 文件说明符 即文件号 在打开文件时 open函数返回一个整数 这就是 文件说明符 文件号 在未关闭此文件之前 此文件说明符与该文件相联系 或者说 它代表一个确定的文件 执行close函数后 文件号释放 它不再与一个确定的文件相联系 它可以再被用来与另一文件相联系 文件号是由系统在打开时分配的 而不是由程序设计设计者指定的 每一个 编译系统规定了可以打开的文件的最大数字 由于一个 编译系统允许同时打开的数目是有限的 因此 凡不再使用的文件应及时用close函数关闭 如果关闭操作失败 如不存在此文件 可把磁盘从驱动取出 则close函数返回 成功时返回零 creat函数 有的C编译系统 例如TurboC 不允许用open函数建立一个新文件 它提供creat函数用来建立新文件 其调用形式为creat 文件名 打开方式 它返回一个整数文件号 例如 fd creat A 1 read函数 read函数的作用是从指定的磁盘文件中读入若干个字符到程序开辟的缓冲区中 read fd buf count 其中fd为文件号 buf是一个地址 它指向程序员指定的 缓冲区 可以是一人数组或一个变量 或一个已分配内存的数据结构 count是一个整数 上述read函数的作用是从fd所代表的文件中文件中 读count个字节的信息到buf指向的缓冲的缓冲区中 如果执行read成功 则函数返回实际读入的字节数 若遇文件结束则函数值返回0 若有错 返回 1 write函数 作用是从指定的内存区将若干个字节的信息输出到指定的文件中 其一般形式为write fd buf count 其中fd buf 和count的含义与read函数中相同 上述write函数的作用是 从buf所指向的内存中区中输出count个字节的信息到fd所代表的磁盘文件中去 Write函数的返回值为实际输出的字节数 如果实际输出的字节数比的指定的count小 则函数值可能比count小 如果执行write有错误 则返回值为 lseek函数和随机读写 用来移动文件位置指针 其调用形式为lseek 文件号 位移量 起始点 其概念大致与缓冲文件系统的fseek函数相同 只是不用文件指针而用文件号来标识文件 起始点 用0 1和2分别代表 文件开始位置 文件 当前位置 和 文件末尾 函数的返回值是长整型 long型 例如 lseek fd 100L 0 将文件位置指针移到离文件开头100字节处lseek fd 10L 1 将文件位置指针从当前位置倒退10个字节如果执行lseek函数失败 则返回 1L 注意 1L代表长整数 1 有了lseek函数就能够实现对非缓冲文件的随机存取 只需事先将文件位置指针移到所需读写的位置上 然后进行读写操作即可 常用的缓冲文件系统函数 分类函数名功能打开文件fopen 打开文件关闭文件fclose 关闭文件文件定位fseek 改变文件位置指针位置fewind 使文件位置指针重新置于文件开头ftell 返回文件位置指针的当前值文件读写fgetc getc 从指定文件取得一个字符gputc putc 把字符输出到指定文件fgets 从指定文件读取字符串fputs 把字符串输出到指定文件 分类函数名功能getw 从指定文件读取一个字 int型 putw 把一个字 int型 输出到指定文件fread 从指定文件中读取数据项fwrite 把数据项写到指定文件fscanf 从指定文件按格式输入数据fprintf 按指定格式将数据写到指定文件中文件状态feof 若到文件末尾 函数值为 真 非0 ferror 若对文件操作作出错 函数值为 真 非0 clearerr 使ferror和feof函数值置零 续 文件读写 常用的非缓冲文件文件函数 分类函数名功能建立文件creat 建立一个原来不存在的文件打开文件open 打开已有文件关闭文件close 关闭已打开的文件文件定位lseek 移动文件位置指针到指定位置文件读写read 从指定文件读入数据 存入指定区域write 把指定区域中的数据写到指定文件中 例student2综合 成绩管理
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!