本文介绍: 以下为本人大一时阅读《C++ Primer Plus》中关于文件处理章节所做的笔记文件和流:每个文件都以一个文件结束符(endof-file maker)当打开一个文件时,一个对象便被建立,并且将一个流关联这个对象文件处理模板类:在C++中执行一个文件处理必须包含头文件<iostream>和<fstream>。创建顺序文件:对于一个ofstream对象,文件打开模式可以ios::out默认)——向一个文件输出数据,或者是ios::ap

以下为本人大一时阅读《C++ Primer Plus》中关于文件处理章节所做的笔记

文件和流:

每个文件都以一个文件结束符(endof-file maker)

打开一个文件时,一个对象便被建立,并且将一个流关联到这个对象

文件处理模板类:

在C++中执行一个文件处理必须包含头文件<iostream>和<fstream>。

创建顺序文件:

对于一个ofstream对象,文件打开模式可以ios::out默认)——向一个文件输出数据,或者是ios::app——将数据输出到文件的结尾(不改变在文件中原有的任何数据)。使用模式ios::out打开存在的文件时,文件会被截顶(truncated),即所有存在于文件汇总数据都将被丢弃。如果这个文件不存在,则ofstream利用这个文件名新建一个文件。

ofstream outClientFile(“clients.txt“,ios::out);

上述代码创建了一个名为outClientFile的ofstream对象,与打开用来输出的文件clients.txt相关联。

ofstream对象默认为输出打开,以上代码与下面语句等同

ofstream outClientFile(“clients.txt“);

成员函数open打开一个文件:

以下代码等同于上述代码:

ofstream outClientFile;

outClientFile.open(“clients.txt“,ios::out);

测试一个文件是否被成功打开

if(!outClientFile)

当if条件成立,说明文件没被成功打开

重载void*运算符

while(cin>>a){

outClientFile<<a<<‘ ‘;

}

outClientFile<<a<<‘ ‘是将内容输入到文件当中

以上语句隐式调用cin成员函数运算符void*,将流转换为指针对流进行检测,当failbitbadbit位都没有cin置位时,这个条件一直是true。当遇到文件结束符时,failbit位被设置

关闭文件:

main函数结束时将隐式地调用outClientFile的析构函数关闭client.txt文件。也可以通过语句调用成员函数close显式关闭ofstream对象:

outClientFile.close();

顺序文件读取数据

ifstream inClientFile(“clients.txt”, ios::in);

同ofstream对象一样,创建一个ifstream对象时也可以不打开一个特定的文件,因为一个文件可以在之后与它关联。

条件语句!inClientFile来判断文件是否被成功打开

从文件中读取

while(inClientFile>>account>>name>>balance)

其实不难理解,就是把cin换成inClientFile,由键盘输入改为由文件输入

文件定位指针

定位文件定位指针成员函数:

istream中为seekg (seek get)

ostream中为seekp (seek put)

每个istream对象都有一个get指针来指出文件中下一个输入字节

每个ostream对象都有一个put指针来指出文件中下一个输出的字节

inClientFile.seekg(a);

inClientFile.seekg(a,ios::beg);

上面两个语句等同,表示相对于流开始位置后a处

同样,ios::cur表示相对当前流的位置进行定位ios::end表示相对于流的结尾进行定位

文件定位指针是一个整数值,这个值说明了文件开始位置到当前位置的字节数(也可以称为文件开始位置的偏移量

同样的操作可以使用ostream成员函数seekp实现成员函数tellg和tellp分别用来返回当前getput指针的位置。

以下语句将get文件定位指针的值赋给long变量location

long location=fileObject.tellg();

reinterpret_cast运算符

reinterpret_cast运算可以把某种类型的指针强制转换为其他无关类型。例如

int number;

outFile.write(reinterpret_cast<const char*>(&amp;number)),sizeof(number);

利用ostream的成员函数write写入字节数据

ofstream outFile;

将一个整数number写入文件的两种写法

outFile<<number;

或者

outFile.write(reinterpret_cast<const char*>(&amp;number)),sizeof(number);

write数中第一个参数指向一个字节的指针,从这个位置开始,write输出到它的第二个参数指定数目的字节到文件当中

二进制模式打开一个用于输出的文件:

如果要写入定长的记录,以二进制格式打开文件是必要的。

ofstream outCredit(“credit.dat”, ios::out | ios::binary);

多种文件打开模式可以通过用( | )将单独的打开模式组合起来:

fstream outCredit(“credit.dat”, ios::in | ios::out | ios::binary);

上述方式打开credit.dat,可以保证将记录写入文件中而不是擦除文件后再进行创建

outCredit.seekp((client.getAccountNumber()-1)*sizeof(ClientData));

上述语句将put文件定位指针到(client.getAccountNumber()-1)*sizeof(ClientData)处。因为账户在1-100之间,所以计算时-1,对于记录1,文件定位指针被设为0。

同理,有ifstream的read函数:

read函数每次只读取一条记录

使用ios的成员函数eof判断到达文件的结尾:

原文地址:https://blog.csdn.net/QQ1149646297/article/details/122532265

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_35004.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注