C 程序设计文件流PPT课件_第1页
C 程序设计文件流PPT课件_第2页
C 程序设计文件流PPT课件_第3页
C 程序设计文件流PPT课件_第4页
C 程序设计文件流PPT课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 C 程序设计文件流 2 为了调用磁盘文件 缓冲文件系统为每一个文件开辟了一个 文件信息区 用来存放与文件操作有关的信息 在C 中 头文件fstream h中定义了文件类 包括 ifstream 它支持从输入文件中提取数据的各种操作 ofstream 它支持把数据写入文件中的各种操作 fstream 支持数据的输入与输出操作 9 4文件的输入 输出 1 文件操作 3 1 定义一个文件类的对象方法如下 例如 ifstreaminfile ofstreamoutfile fstreamiofile 2 打开文件 建立文件对象 变量 与磁盘文件之间的联系 3 对打开文件的操作 可以使用成员函数或 运算符对文件进行读写操作 4 文件操作完成后 应该用成员函数关闭打开的文件 4 1 文件的打开 open 所谓 打开 实际上是在程序和操作系统之间建立起联系 通过文件的打开操作为所处理的文件定义一个文件指针 文件指针并不是直接指向所处理的文件本身 而是指向内存中用于存放文件信息的文件信息区 在文件打开后文件信息区就与该文件建立了一对一的联系 然后使用文件类所提供的成员函数 类似于成员变量 将数据写入到对应的文件中去 9 4 1文件的打开和关闭 5 定义的文件类对象后 使用成员函数打开文件 ifstreaminfile ofsreamoutfile fstreamfile infile open myfile in txt 打开一个只读文件outfile open myfile out txt 打开一个只写文件file open myfile txt ios in 以只读方式打开文件在定义文件类对象时直接打开文件 ifstreaminfile myfile in txt ofstreamoutfile myfile out txt fstreamfile myfile txt ios in 打开文件的方法可以有 6 在头文件ios h中 定义了文件打开方式的枚举成员 enumopen mode in 0 x01 00000001按读方式打开文件out 0 x02 00000010按写方式打开文件ate 0 x04 00000100打开文件时将文件指针移app 0 x08 00001000到文件的结尾处trunc 0 x10 00010000nocreate 0 x20 00100000noreplace 0 x40 01000000binary 0 x80 10000000以二进制方式打开文件 2 文件的打开方式 7 每一种打开方式是以一个二进制位来表示的 所以可以用二进制位或运算 将允许的几种方式组合起来使用 如 ios out ios ate 打开一个输出文件并将指针移到文件尾ios in ios binary 打开一个二进制文件用于输入ios out ios trunc 打开一个输出文件并清除原有内容 8 9 Ifstream类的成员函数open的原型为 Open constchar int ios in int filebuf openprot 其缺省的文件打开方式为ios in ofstream类的成员函数open的原型为 Open constchar int ios out int filebuf openprot 其缺省的文件打开方式为ios out fstream类的成员函数open的原型为 Open constchar int int filebuf openprot 其缺省的文件打开方式必须指定 由文件打开方式的说明可知 10 关闭 就是使文件指针变量不指向该文件 也就是使文件指针变量与文件 脱钩 此后不能再通过该指针对其相连的文件进行读写操作 除非再次打开 无论是ifstream ofstream还是fstream 关闭文件的操作都是 Close 如 infile close outfile close file close 关闭文件时 系统把与该文件相关联的内存缓冲区中的数据写到文件中 收回与该文件相关的文件信息区 把文件名与文件对象之间建立的关联断开 2 文件的关闭 close 11 在打开文件后 通常要判断打开是否成功 若打开成功 则文件流对象值为非零值 若打开不成功 则其值为0 为此 打开文件的格式可以写为 ifstreamf1 file dat if f1 cout 不能打开文件 file dat n exit 1 3 文件操作的保护 12 charfilename 256 cout filename ofstreamf5 f5 open filename if f5 cout 不能打开文件 file dat n exit 1 13 C 的三个文件类ifstream ofstream和fstream由于继承了cin和cout的特性 因此具有与cin和cout相同的成员函数 如 与cin get char 对应的有 infile get char 与cin getline char intsize 对应的 infile getline char intsize 与cout put char 对应的 outfile put char 此外还有用于标准输入输出设备的提取 和插入 运算符 9 4 2文本文件的读写操作 14 例 编写程序 读取源程序文件并复制到目的文件中去 include include includevoidmain void charfilename in 256 filename out 256 cout filename in cout filename out ifstreaminfile filename in ifstreaminfile if infile infile open filename in cout 不能打开输入文件 filename in n exit 1 ofstreamoutfile filename out if outfile cout 不能打开输出文件 filename out n exit 2 15 infile unsetf ios skipws 设置为不要跳过文件的空格charch while infile ch 当到达文件结尾时 infile ch的返回 值为0 结束循环 outfile ch 否则其返回值不为0 继续循环 infile close outfile close 16 处理文件复制问题的另外两个方案 方案2 适用于任何类型的文件 charch 成员函数完成从源文件中字符读取 这样while infile get ch 将不会自动跳过空格 outfile put ch 将ch中的字符写到目的文件中 infile close outfile close 方案3 只适用于文本文件 charbuff 300 while infile getline buff 300 从源文件中读取一行字符 不含 n 字符 outfile buff n infile close outfile close 17 对二进制文件的读写操作是通过成员函数read 和write 来实现的 函数的原型为 read char buf intsize 功能 从文件中读取由size所指定的字节数据到buf所指向的存储单元中 write char buf intsize 功能 将由buf所指向的存储单元中的size个字节数据写入到文件中 9 4 3二进制文件的读写操作 18 include includevoidmain void ofstreamoutfile d source data dat ios out ios binary if outfile cout 不能打开输出文件 data dat n exit 1 for inti 2 i 500 i 2 outfile write char 例 产生一个二进制文件 将1 500之间的所有偶数写入文件data dat中 19 include includevoidmain void ifstreaminfile d source data dat ios binary if infile cout 不能打开输入文件 data dat n exit 1 inta 250 infile read char a sizeof int 249 for inti 0 i 249 i cout a i t if i 1 10 0 cout n cout n infile close 例 从上例中产生的数据文件data dat中读取二进制数据 并在显示器上按每行10个数据的形式显示 20 处理文件复制问题的另一个方案 方案4 While infile eof infile read buf 4096 outfile write buf 4096 eof 用于测试文件结束 当文件结束时 函数返回非0 否则返回值为0 该程序可以实现任意文件类型的拷贝 包括文本文件 数据文件甚至可执行文件 21 例9 10 创建二进制数据文件 及数据文件的读取 类inventory与 例9 9 基本一样 只是用二进制文件的Bdatatofile 和Bdatafromfile 取代了文本文件的提取运算符 和插入运算符 voidinventory Bdatafromfile ifstream 由此可见读和写是完全对称的过程 次序决不能错 22 voidinventory Bdatatofile ofstream 23 ddatafile close ifstreamsdatafile d Ex9 10 data ios in ios binary 重新打开文件 从头读取数据car2 Bdatafromfile sdatafile 从文件读取数据拷贝到对象car2if sdatafile eof 0 cout 读文件成功 endl cout 对象car2 endl cout car2 motor2 Bdatafromfile sdatafile 继续从文件读取数据拷贝到对象motor2if sdatafile eof 0 cout 读文件成功 endl cout 对象motor2 endl cout motor2 sdatafile close return0 24 9 4 4文件的随机访问 在文件信息区中存在一个用于指示当前文件读取位置的指针变量 称为文件定位指针 C 语言不仅允许按文件中信息的先后顺序来进行读写 同时也允许从文件中的任何位置开始进行数据的读写操作 这种读写方式就称为文件的随机访问 C 的istream和ostream类中分别提供了几个支持文件随机访问的成员函数 25 istream类 输入文件 seekg longstreampos 将文件定位指针移动到strampos所指定的位置 seekg longstreamoff seek dir 将文件定位指针按seek dir确定的方向移动streamoff位置 tellg 返回输入文件中文件定位指针当前的位置 ostream类 输出文件 seekp longstreampos 将文件定位指针移动到strampos所指定的位置 seekp longstreamoff seek dir 将文件定位指针按seek dir确定的方向移动streamoff位置 tellp 返回输出文件中 文件定位指针当前的位置 26 27 例如 infile seekg 500 文件定位指针移到距文件头500个字节处infile seekg 100 ios cur 文件定位指针从当前位置前移100个字节infile seekg 100 ios cur 文件定位指针从当前位置后移100个字节outfile seekp 100 ios end 文件定位指针从文件尾开始前移100个字节注 1 前移 指文件定位指针从文件尾向文件头方向移动 streamoff为负值 后移 指文件定位指针从文件头向文件尾方向移动 2 在移动文件指针时 必须保证移动后的指针值大于0且小于等于文件尾字节编号 否则将导致接着的输入输出操作失败 28 例 产生一个5 1000之间的奇数文件 二进制文件 将文件中的第20 30之间的数读出后输出 include includevoidmain void ofstreamoutfile data dat ios out ios binary inti for i 5 i 1000 i 2 outfile write char 29 9 6文件与对象 规范化操作 在面向对象的程序设计中 信息总是放在对象的数据成员里 这些信息最终应该保存到文件中 当程序开始运行时要由打开的文件重新创建对象 在运行过程中 放在对象的数据成员里的信息得到利用和修改 运行结束时必须把这些信息重新保存到文件中 然后关闭文件 在面向对象的C 程序设计中 文件应该在构造函数中打开 并创建对象 而在析构函数中保存和关闭文件 并撤销对象 当撤销对象时 能自动释放资源 释放资源包括将对象中的信息再次存入磁盘文件 程序运行中 总要对保存在对象的数据成员里的信息进行操作 这时应该将信息适时保存到相应的磁盘文件中 以免数据意外丢失 这些都是常规操作 是面向对象的C 程序设计的固定框架 30 例9 13 将商店的货物 定义为一个货物数组类 数组对象动态建立 初始为2个元素 不够用时扩充一倍 用文本数据文件建立数组元素对象 要求放在构造函数中 而数据的保存和文件的关闭放在析构函数中 第一次运行时 建立空的数据文件 由键盘输入建立数组元素对象 并写入文件 程序退出时 关闭文件 下一次运行由该文件构造对象 恢复前一次做过的工作 这是一个标准的面向对象的程序设计 也是对前面各章内容的小结 注意 本例使用了多重的插入运算符重载 31 例9 13面向对象的C 程序设计的固定框架 classinventory stringDescription 商品名称stringNo 货号intQuantity 数量doubleCost 价格doubleRetail 零售publi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论