C++文件处理

一、 文件和流

每个文件不是以文件结束符结束,就是以在由系统维护和管理的数据结构中特定的字节号处结束。文件打开时,就会创建一个对象,将这个对象和某个流关联起来。
Cin,cout,cerr,clog这4个对象会自动生成。与这些对象相关联的流提供程序与特定文件或设备之间的通信通道。

 

二、 文件处理包括头文件

<iostream.h>----------<fstream.h>

 

三、 创建顺序访问文件

创建了流类ifstream(读入),ofstream(输出),fstream(读入/输出)对象后,便打开了文件。
对于ofstream对象,文件打开方式可以是ios::out(将数据输出到文件)或ios::app(将数据添加到文件末尾,不修改文件中现有的数据),现有的文件用ios::out打开时会被截掉,即文件中的所有数据均被删除。如果指定文件不存在,就用该文件名建立它。
例:ofstream outClientFile( “clients.dat”, ios::out );
打开了文件的ofstream构造函数,这样就建立了与文件的通信。


文件打开方式一览:

ios::app  将所有的输出写入文件的末尾
ios::ate  打开文件以便输出,并移动文件末尾(通常用语在文件中添加数据)。数据可以写入文件的任何地方
ios::in  打开文件以便输入
ios::out  打开文件以便输出
ios::trunc 删除文件现有内容(这也是ios::out的默认操作)
ios::binary 打开文件以二进制(也就是非文本)格式输入或输出exit函数终止程序时,参数为0表示程序正常终止,其他任何值表示程序因某个错误而终止。

 

四、 读取顺序访问文件中的数据

例如:

ifstream类和ostream类都提供成员函数,使程序重新定位“文件位置指针”,这些成员是ifstream类的seekg和ostream类的seekp,每个istream对象有一个get指针,表示文件中一下个输入相同的字节数,每个ostream对象有一个put指针,表示下有一个输出相同的字节数。
   例:  inClientFile.seekg( 0 );将文件位置指针移动到文件开头,seekg的参数通常为long类型的整数。Seekg还有第2个参数,可以指定查找方向,ios::beg(默认)相对于流的开头定位,ios::cur相对于流的当前位置定位,ios::end相对于流结尾定位。文件位置指针是个整数值,指定文件中离文件开头的相对位置(偏移量)。
例如:

  

 

五、 更新顺序访问文件

案例:
原记录: 300 White 0.00
改为  : 300 Worthington 0.00
因为新记录的长度大于原始记录的长度,所以从‘ton’中的‘o’之后的字符将重定
为文件中的下一条顺序记录,其原因在于:使用流插入操作符<<和流读取操作符>>的格式化输入/输出模型中,域的宽度不定,所以记录的宽度也不定。
例如:7.14  -117  2047   25482都是int类型的值,虽然他们的内部存储占相同的字节数,但是将他们以格式化文本打印到屏幕上或存储在磁盘上时站用的域不一样。因此格式化输出/输入模型通常不用于更新现有的记录。

 

六、 随机访问文件

生成顺序文件和从顺序访问文件搜索特定信息顺序访问文件不适宜快速访问应用程序,即立即找到特定记录的信息。快速应用程序是用随机访问文件实现,这种文件的各个记录可以直接快速的访问,而不需要进行搜索。
随机访问文件中的每条记录有相同的长度,所以能够用记录关键字的函数计算出每条记录相对于文件起始点的位置 。

七、 建立随机访问文件

ostream成员函数write把从内存中指定位置开始的固定个数的字节输出到指定流中。当流与文件关联时,数据被写到put文件位置指针所指的位置。Istream成员函数read把固定数目的字节从指定流输入到内存中指定地址开始的区域中。如果流与文件关联,则该字节从get文件位置指针指定的文件地址开始输入。
例: 将一个4字节的整数number,不再用 outFile << number;
打印1位或11位(10位加一个符号位,各自需要1字节的存储空间)改用
outFile.write( reinterpret_cast< const char * >( &number ), sizeof( number));
write函数要求一个const char *类型的数据作为第一个参数,因此我们用reinterpret_cast< const char * >强制类型转换操作符将number的地址变为const char *指针。第二个参数是size_t类型的整数,指定写入的字节数。
随机存取文件处理程序很少在文件中只写入一个域,通常会一次写如一个struct或一个
class对象。
例如:

 

八、 向随机访问文件随机写入数据

ostream的函数seekp和write用于将数据保存到文件的指定位置。
OutCredit.seekp( ( client.accountNumber – 1 ) * sizeof ( ClientData ));
将对象的“put”文件位置指针放在( client.accountNumber – 1 ) * sizeof ( ClientData )求出的字节位置处。
Ofstream的对象outCredit用文件打开方式ios::ate打开。“put”文件位置指针最初在文件末尾,但数据可以在文件任何位置写入。

 

九、 从随机访问文件中顺序读取数据

例:

例子:

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值