c++通过一族定义在标准库中的类型来处理IO。这些类型支持从设备读取数据,向设备写入数据的io操作。
1)IO类
io类根据处理对象的不同分别定义在下面三个库中
头文件 | |
iostream | istream, wisream 从流中读取数据 |
ostream, wostream 向流写入数据 | |
iostream, wiostream 读写流 | |
fstream | ifstream, wifstream 从文件读取数据 |
ofstream, wofstream 向文件写入数据 | |
fstream, wfstream 读写文件 | |
sstream | istringstream, wistringstream 从string读取数据 |
ostringstream, wostringstream 向string写入数据 | |
stringstream, wstringstream 读写string |
----标准库使我们可以忽略不同流对象之间的差异。不管具体是哪种类型, 我们都可以利用 >> 读取数据, 用<< 写入数据。
一个比较经典的例子就是在读取一行多个数字而不知道数字的个数的时候是, 可以通过stringstream来实现
char ch; string s;
getline(cin, s); //这里不能用>>, 因为>>读到空格结束
stringstream ss(s); //将字符串流与字符串绑定, 之后就可以像使用标准输入流一样使用了
int a; vector<int>v;
while (ss >> a) v.push_back(a);
----io对象不能进行拷贝或赋值。
ostream out1, out2;
out1 = out2; // 错误 不能对流对象赋值
ostream out3(out1)//错误 不能拷贝流对象
由于不能拷贝IO对象, 因此我梦不能将函数形参或返回值设置为流类型。进行IO操作的函数通常以引用方式传递和返回流。
----fstream继承自iostream, 但多了open和close两个方法。fstream在使用前要打开一个文件与之绑定。打开时要确定文件打开的模式。
in | 打开文件做读操作 |
out | 打开文件做写操作 |
app | 每次在写之前找到文件尾 |
ate | 打开文件后立即将文件定位到文件尾 |
trunk | 打开文件时清空已存在的文件流 |
binary | 已二进制的模式进行IO操作 |
下面以对名为“a.txt"的文件操作为例。
// cout << judge(line(1, 1, 2, 1), line(0, 1, 0, 2)) << endl;
//以out模式打开文件, 写入数据
fstream out; //初始化一个fstream流
out.open("a.txt", ios::out); //用open方法打开文件并将流与文件绑定
string s;
while(getline(cin ,s))
{
out << s;
}
/*注意这里提到的模式是文件的模式, 一个文件不能同时打开两次,
需要将之前与它绑定的流恢复到初始状态。而close只是关闭流而不会改变流内部的状态,
所以需要用clear将流复位之后再用close关闭*/
out.clear();
out.close();
//以in模式打开文件读取数据
fstream in("a.txt", ios::in) //也可以在初始化的同时绑定
while(getline(in, s))
{
cout << s <<endl; //依次输出文件的每一行
}