学习 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? 文件over (linux中 ctrl+d(文件结束符))      2 I/O流错误     无效数据

4 理解管理输出缓冲区刷新几种情况 注意(调试程序要及时刷新输出缓冲区 有利于定位bug)

还有其他一些零碎的知识在看书吧!!!!!

              最后一个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;
}

 

原文地址:https://www.cnblogs.com/zhangkele/p/7828681.html