C++把文件看成无结构的字节流,文件中只存储了数据,没有存储记录的逻辑结构,编码方式分为文本文件(顺序存取)和二进制文件(随机存取)。
存取方式分为顺序文件和随机文件(有一部分指针和函数可以实现跳跃式的读取和存储)。
要执行文件的输入输出,须做以下几件事:
(1) 在程序中包含头文件fstream;
(2) 建立文件流。
建立文件流的过程就是定义流类的对象,例如:
ifstream in;
ofstream out;
fstream both;
分别定义了输入流对象in;输出流对象out,输入输出流对象both。
(3) 使用open()函数打开文件,也就是使某一文件与上面的某一流相联系。
open()函数是上述三个流类的成员函数,其原型是在fstream.h中定义的, 原型为:
void open(const unsigned char*,int mode,int access=filebuf::openprot);
第一个参数用于传递文件名;
第二个参数mode值表示文件的使用方式;
第三个参数打开文件的共享方式
具体的值在使用时查找即可
(4) 对open结果进行检查
(检查打开操作是否成功。可省略,但不推荐。)
(5)进行读写。
在建立(或打开)的文件上执行所要求的输入或输出操作;
(6)关闭文件流对象。
实际使用
读取文件
重载>>运算符
istream& operator>>(istream& in, Book& book)
{
string* temp = const_cast<string*>(&book.ISBN);
string input;
in >> input;
*temp = input;
in >> book.bname >> book.writer >> book.publisher >> book.publishdate >> book.btype;
return in;
}
load函数,使数据从文件中读取到内存,并做一些初始化的操作
void Operation::loadBook()
{
Book a;
ifstream in("E:\\inbook.txt");
if (!in)
return;
while (!in.eof())
{
in >> a;
int temp1, temp2;
in >> temp1 >> temp2;
a.setTotal(temp1);
a.setNum(temp2);
book.push_back(a);
bookname.insert(make_pair(a.getBname(), book.size() - 1));
bookid.insert(make_pair(a.getIsbn(), book.size() - 1));
}
in.close();
}
写入操作
重载<<运算符
ostream& operator<<(ostream& out, Book& book)
{
out << book.ISBN << " " << book.bname << " " << book.writer << " " << book.publisher << " " << book.publishdate << " " << book.btype << " " << book.total << " " << book.num << endl;
return out;
}
将处理后的数据从内存写入文件(遍历),做持久化处理
void Operation::saveBook()
{
ofstream out("E:\\outbook.txt");
vector<Book>::iterator it;
for (it = book.begin(); it != book.end(); it++)
{
out << *it;
}
out.close();
}
关于文件操作的系统开发思路
一般的系统都是需要文件存盘的,文件起到的作用就是持久化,程序运行后内存不会保存,那么也就需要将处理后的数据储存到磁盘中,也就是所谓的持久化处理。
关于这类的系统开发,主要是这样的思路:
从文件中读取初始数据到内存(往往是数组啊,链表啊之类的)->在内存中对数组链表进行处理->处理过后将处理后的结果遍历一遍,保存到文件中。
而第一步读取数据到内存中往往放到构造函数内部,也就是在初始化对象的同时也就进行了读文件的操作;最后一步存盘操作往往放到析构函数内部,也就是在对象调用结束的时候自动执行存盘。