C++文件操作专题

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函数,使数据从文件中读取到内存,并做一些初始化的操作

扫描二维码关注公众号,回复: 11239788 查看本文章
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();
}

关于文件操作的系统开发思路

一般的系统都是需要文件存盘的,文件起到的作用就是持久化,程序运行后内存不会保存,那么也就需要将处理后的数据储存到磁盘中,也就是所谓的持久化处理。
关于这类的系统开发,主要是这样的思路:
从文件中读取初始数据到内存(往往是数组啊,链表啊之类的)->在内存中对数组链表进行处理->处理过后将处理后的结果遍历一遍,保存到文件中。
而第一步读取数据到内存中往往放到构造函数内部,也就是在初始化对象的同时也就进行了读文件的操作;最后一步存盘操作往往放到析构函数内部,也就是在对象调用结束的时候自动执行存盘。

猜你喜欢

转载自blog.csdn.net/qq_45654306/article/details/105802577