C++中的文件处理

C++中的文件处理,第1张

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

文件和流:

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

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

文件处理模板类:

在C++中执行一个文件处理必须包含头文件

创建顺序文件:

对于一个ofstream对象,文件打开模式可以是ios::out(默认)——向一个文件输出数据,或者是ios::app——将数据输出到文件的结尾(不改变在文件中原有的任何数据)。使用模式ios::out打开已存在的文件时,文件会被截顶(trunclass="superseo">cated),即所有存在于文件汇总的数据都将被丢弃。如果这个文件不存在,则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<

}

outClientFile<

以上语句隐式调用了cin的成员函数运算符void*,将流转换为指针对流进行检测,当failbit和badbit位都没有为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分别用来返回当前的get和put指针的位置。

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

long location=fileObject.tellg();

reinterpret_cast运算符

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

int number;

outFile.write(reinterpret_cast(&number)),sizeof(number);

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

ofstream outFile;

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

outFile<

或者

outFile.write(reinterpret_cast(&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://outofmemory.cn/web/993148.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存