以下为本人大一时阅读《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 |
利用ostream的成员函数write写入字节数据
ofstream outFile; |
将一个整数number写入文件的两种写法:
outFile< |
或者
outFile.write(reinterpret_cast |
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判断到达文件的结尾:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)