学习 primer 第8章 IO库 小结
iostream处理控制台IO
fstream处理命名文件IO
stringstream完成内存string的IO
非常重要!!!!!!!!!!
=============================================================================
1 cin是一个istream对象 是从标准输入读取数据
2 cout是一个ostream对象 是从标准输出写入数据
3 cerr一个ostream对象 通常输出程序的错误消息 写入到标准错误
4 >>运算符 是用来从一个istream对象读取输入数据
5 <<运算符 是用来从一个ostream对象写入输出数据
6 getline函数 是从一个给定的istream 读取一行数据 存入一个给定的string对象中
(插入讲下getline函数以及 << 运算符)
使用getline(cin,line)读取一整行:line是一个string类型 , 有时候希望在最终的得到的字符串中 保留输入时候的空白符 这时应该用getline函数代替原来的>>运算符。
getline函数的参数是一个输入流和一个string对象 函数从输入流中读入内容 直到遇到换行符为止(注意换行符也被读进去了),然后将所有的内容存入到那个string对象中去(不存换行符)。getline只要一遇到换行符就结束读取操作并返回结果。
和输入运算符一样 getline也返回他的流参数 因此既然输入运算符能作为判断条件 也就能用getline的结果作为条件
例1:while(std::cin>>value) //int value
while循环条件的求值就是执行表达式:std::cin >> value 此表达式从标准输入读取下一个数,保存在value中 输入运算符返回其左侧运算符对象,就是std::cin。实际就是检测std::cin。 当使用istream对象作为条件时,其效果就是检测流状态。 有效流 即未遇错误,检测ok。 当遇到文件结束 或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效。无效状态的istream对象会使条件变为假。
=============================================================================
类fstream 和 stringstream都是继承自类iostream的。
输入都是继承自istream 输出都是继承自ostream 。因此 可以在istream对象上执行的操作,也都可以在ifstream和istringstream对象上面执行 。继承自ostream的输出类也有类似情况!
1 IO对象无拷贝或赋值(理解就好)书上p279
2 一个流一旦发生错误 其后续的IO操作都会失败。只有一个流处于无错误状态 才可以从他读取数据 or写入数据
3 while(cin >> i) 什么情况下循环会over? 1 文件over (linux中 ctrl+d(文件结束符)) 2 I/O流错误 3 无效数据
4 理解管理输出缓冲区刷新几种情况 注意(调试程序要及时刷新输出缓冲区 有利于定位bug)
5 还有其他一些零碎的知识在看书吧!!!!!
最后一个demo 仔细读一读!
#include<iostream> #include<fstream> #include<string> #include<vector> using namespace std; int main(){ ifstream in("data");//就是读取当前目录下面这个data文件了 if(!in){ //这里就是要检测下流是否ok 好习惯 cerr<<"do not open inputfile"<<endl; return -1; } //==================================================================== //添加一个 out输出对象 测试下看看 ofstream out("data1"); if(!out){ //这里就是要检测下流是否ok 好习惯 cerr<<"do not open inputfile"<<endl; return -1; } out<<"zhangkele github zhangkele1221@163.com"; //我们正常的cout<<" "; 是将" "内容定向到屏幕文件 这次定向到自己规定的文件里 //这里运用了<<输出运算符号向out对象写入 ok明白意思了吧 out.close();//好习惯 要关闭打开的流对象 除非局部的流对象他会自己析构掉 //=========================================================================== string line; vector<string> words; while(in>>line){//也是需要理解的 和下面的一样需要自己阅读primer书 //while(getline(in,line)){//需要彻底的理解getline函数的原理 words.push_back(line); } in.close();//好习惯 要关闭打开的流对象 除非是局部的流对象他会自己析构掉 auto it = words.begin(); while(it!=words.end()){ cout<<*it<<endl; ++it; } return 0; }