目录
IO类
iostream定义了用于读写流的基本类型
fstream定义了读写命名文件的类型
sstream定义了读写内存string对象的类型
标准库使我们能忽略不同类型的流之间的差异,这是通过继承机制实现的(例如ifstream继承自istream)
IO对象无拷贝或赋值
因为不能拷贝,所以不能将形参和返回值类型设置为流类型,所以进行IO操作的函数要以引用的方式传递和返回流。
条件状态
有一些函数和标志,可以帮助我们访问和操纵流的条件状态
p280
管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据
有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。
unitbuf操纵符--告诉流在接下来的每次操作中都进行一次flush操作(刷新缓冲区)
注意:如果程序崩溃,输出缓冲区不会被刷新。因此有时程序其实已经执行完了,只不过结果因为缓冲区没有刷新没法显示!
当一个输入流被关联到输出流时,从输入流读数据,就会先刷新关联的输出流。标准库将cout和cin关联在一起
怎么关联?——tie
版本1:不带参数,返回指向输出流的指针(空指针/该对象关联的输出流的指针)
版本2:接受一个指向ostream的指针,关联到该ostream
文件输入输出
头文件fstream定义了三种类型——ifstream ofstream fstream
文件类型分为文本文件和二进制文件
写文件
而文件打开方式有:
文件打开方式是可以配合使用的,在中间用 | 操作符就ok
读文件
int main() {
ifstream ifs;
ifs.open("z.txt", ios::in);
if (!ifs.is_open()) {
cout << "打开失败!" << endl;
return 0;
}
//读数据
//1.
char buf[1024] = { 0 };
while (ifs >> buf) {
cout << buf << endl;
}
//2.
char buf[1024] = { 0 };
while (ifs.getline(buf,sizeof(buf))){
cout << buf<<endl;
}
//3.
string buf;
while (getline(ifs, buf)) {
cout << buf << endl; //都是一行行读
}
//4.
char c;
while ((c=ifs.get())!=EOF) {
cout << c;
}
ifs.close();
}
读写文件-二进制
用到了ofs和ifs类中的write和read函数,同时要记得在open时加上打开方式ios::binary
class Person {
public:
char name[64];
int age;
};
int main() {
ofstream ofs;
ofs.open("Person.txt", ios::out | ios::binary);
Person p = { "喵喵",8 };
ofs.write((const char*)&p, sizeof(Person));
ofs.close();
ifstream ifs;
Person buf;
ifs.open("Person.txt", ios::in | ios::binary);
ifs.read((char*)&buf, sizeof(Person));
cout << buf.name << " " << buf.age;
ifs.close();
}
string流
当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用istringstream
struct personInfo {
string name;
vector<string>phone;
};
int main() {
string line, word; //line中存放每一条记录,word是姓名后边的一串电话
vector<personInfo> people; //保存来自所有输入的记录
while (getline(cin, line)) {
personInfo info;
istringstream record(line); //把record绑定到line
record >> info.name; //读取名字
while (record >> word) //读取名字后面的一个个单词
info.phone.push_back(word);
people.push_back(info);
}
}
当我们逐步构造输出,希望最后一起打印时,用ostringstream
(p289)
先把输出内容“写入”到一个ostringstream对象中
os<<xxxx
之后输出:cout<<os.str() //返回一个字符串