14.1 文件和流
文件
1、内存中数据的存储是临时的,而用文件存储的数据是永久的——文件被储存在辅助存储设备中,如硬盘、CD、DVD、闪存驱动器和磁带
特点
每个文件都以一个文件结束符或者以存储在操作系统维护、管理的数据结构中的一个特定字节数
文件处理模板
-
typedef ifstream 是一个对basic_ifstream 的特化,允许文件输入字符 -
typedef ofstream 是一个对basic_ofstream 的特化,允许文件输出字符 -
typedef fstream 是一个对basic_fstream 的特化,允许文件输入、输出字符
注意:该模板都是从basic_iostream\basic_istream\basic_ostream 中“继承”而来,包含其所有的成员函数
14.2 创建顺序文件
打开一个文件
?ofstream outputFile("credit.dat", ios::out);
?if(!outputFile){cerr<<"File could not be opened";exit(EXIT_FAILURE);}
打开文件有两个参数:文件名和文件打开模式
文件名:若文件不存在,则自动创建该文件名的文件
文件打开模式ios::out ——向一个文件输出数据:默认截顶,会自动清空文件里的数据重新输出
ofstream 对象默认为ios::out 文件打开模式
模式 | 描述 |
---|
ios::app | 将输出文件添加到文件尾,不截顶 | ios::ate | 可以再文件任何位置输出数据,默认为文件尾 | ios::in | 打开文件输入 | ios::out | 打开文件输出,截顶 | ios::trunc | 丢弃文件的内容 | ios::binary | 打开一个文件进行二进制输入/输出 |
使用open 打开一个文件
?ofstream outputFile;
?outputFile.open("credit.dat", ios::out);
14.3 从顺序文件中读取数据
?ifstream inFile("credit.dat", ios::in);
?if(!inFile){cerr<<"File coule not be opened";exit(EXIT_FAILURE);};
默认为输入打开模式,也可以使用open 成员函数打开文件
文件定位指针
seekg() 成员函数重定位下一个文件读入的字节号
seekp() 成员函数重定位下一个文件输出的字节号
传递给重定位成员函数的第一个参数通常是一个long 类型的整数
参数2 | 作用 |
---|
ios::beg | 从流的开始位置定位 | ios::cur | 从流的当前位置进行定位 | ios::end | 相对于流的结尾进行定位 |
tellg();tellp(); 用于高速下一个文件输入/输出的字节号
14.4 随机存取文件
输出和读取
成员函数write() 输出字节数据
outputFile.write(reinterpret_cast<const char*>(&client), sizeof(ClientData));
write() 函数将第一个参数作为一组字节数据,将内存中的对象看做const char* 类型,表示指向一个字节的指针;第二个参数为输出的字节数
reinterpret_cast<>()运算符转换指针类型
作用:把某种类型强制转换为其他无关类型
注意:该转换是在编译阶段完成,不会改变指针所指对象的类型
string 类成员函数copy()
?string string1 = "stringCopy";
?char string2[10];
?string1.copy(string2, 10);
成员函数copy() 的两个参数:
第一个参数:将要复制赋值的string 数组
第二个参数:要复制的字符个数
用二进制模式打开一个输出文件
?ofstream outputFile("credit.dat", ios::out|ios::binary);
通过运算符"|"可以组合多种打开模式
成员函数read() 读取文件数据
inFile.read(reinterpret_cast<char*>(&client), sizeof(ClientData));
第一个参数:要求的参数类型为char * ,需用强制类型转换
第二个参数:读取的字符数
判断是否读取到文件尾
?while(inFile && !inFile.eof()){};
|