zoukankan      html  css  js  c++  java
  • 你发现了奇怪的笔记四(C++)

    IO类

    IO库条件状态

    • strm是一种IO类型(iostream,fstream,sstream).
    • 置位就是bai置1,复位就是清0
    状态 解释
    strm::iostate iostate是一种极其相关的类型,提供了表达条件的完整功能
    strm::badbit 用来指出流崩溃
    strm::failbit 用来指出一个Io操作失败
    strm::eofbit 用来指出流到达了文件结束
    strm::goodbit 用来指出流末处于错误状态。此值保证为0
    s.eof() 若流s的eofbit置位,则返回true
    s.fail() 若流s的failbit或badbit置位,则返回true
    s.good() 若流s处于有效状态,则返回true
    s.clear() 若流s中所有条件状态复位,将流的状态设置为有效.返回void
    s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate.返回void
    s.setstate(flags) 根据给定的flags标志位,将流s中对应条件状态位置为。flags的类型为strm::iostate。返回void
    s.rdstate() 返回流s的当前条件状态。返回类型为strm::iostate

    管理输出缓冲

    • 导致缓冲刷新原因

      • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
      • 缓冲区满时,需要刷新缓冲,而后新的数据才能被继续写入缓冲区。
      • 我们可以输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr时设置unitbuf的,因此写到cerr的内容都是立即刷新。
      • 我们可以使用操作符endl来显示的刷新缓冲区
      • 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。e.g 默认情况下,cin和cerr都关联到cout。因此,都cin或者写cerr都会导致cout的缓冲区被刷新。
    • unitbuf

    cout<<unitbuf;//所有的输出操作后都会立即刷新缓冲区
    cout<<nounitbuf;//回到正常的缓冲方式
    

    程序异常终止,输出缓冲区不会刷新。所以未打印出的数据会停留在缓冲区中等待打印。所以调试时应注意这点。不要浪费时间区追踪为什么没有执行上。

    • tie

      • 版本一:不带参数,返回指向输出流的指针。如果对象当前关联到一个输出流,则返回的就是指向这个流的指针。如果未关联到流,则返回空指针。
      • 版本二:接受一个指向ostream的指针,将自己关联到此ostream。即,x.tie(&o)将流x关联到流o。
      cin.tie(&cout);//仅仅用来展示:标准库将cin和cout关联在一起
      //old_tie指向当前关联到的cin流(如果有的话)
      ostream *old_tie=cin.tie(nullptr);//cin不再与其他流关联
      //将cin与cerr关联、不建议这样做,因为cin应该和cout关联
      cin.tie(&cerr);//读取cin会刷新cerr而不是cout
      cin.tie(&old_tie);//重建cin和cout间的正常关联
      

    文件流

    • 特有操作(可以和iostream一样使用>> ,<<)
    操作 解释
    fstream fstrm; 创建一个未绑定的文件流。fstream时头文件fstream中定义的一个类型
    fstream fstrm(s); 创建一个fstream,并打开名未s的文件。s可以时string类型,或者时一个指向c风格字符串的指针。这些构造函数都是explicit的。默认的文件模式Mode依赖于fstream的类型
    fstream fstrm(s,mode); 与前一个构造函数类似,但指定Mode打开文件
    fstrm.open(s) 打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向c风格字符串的指针。默认的文件Mode用来与fstream的类型。返回void。
    fstrm.open(file,mode) 打开文件file,并以Mode模式打开,不指定打开模式将默认mode打开
    fstrm.clost() 关闭与fstrm绑定的文件。返回void
    fstrm.is_open() 返回一个bool值,指出与fstrm关联的文件是否成功的打开并且尚未关闭
    • 正确的使用
    for(auto p=argv+1;p!=argv+argc;++p)
    {
    	ifstream input(*p);//创建输出流并打开文件
    	if(input)//如果文件打开成功,处理文件
    	{
    		process(input);
    	}
    	else
    	{
    		cerr<<"could not open:"+string(*p);
    	}
    }//每个循环步都会离开作用域,因此会被销毁
    //但一个fstream对象被销毁时,close会被自动调用
    
    • 文件模式
    模式 解释
    in 以读方式打开
    out 以写方式打开
    app 每次写操作前均定位到文件末尾
    ate 打开文件后立即定位到文件末尾
    trunc 截取文件
    binary 以二进制方式进行IO

    默认情况下,当我们打开一个ofstream时,文件内容会被丢弃。阻止一个ofstream清空给定文件内容的方式是同时指定app模式:

    //file1都会被截取
    ofstream out("file1");//隐含以输出模式打开文件并截取文件
    ofstream out2("file1",ofstream::out);//隐式的截取文件
    ofstream out2("file1",ofstream::out | ofstream::trunc);//显示的截取文件
    //为了保留文件按内容,显示的指向app模式
    ofstream app("file2",ofstream::app);//隐含为输出模式
    ofstream app2("file2",ofstream::out | ofstream::app);
    

    string流

    • istringstream和ostringstream(可以和iostream一样使用>> ,<<)

    • 操作

      操作 解释
      sstream strm; strm是一个为绑定的stringstream对象。sstream是头文件sstream中定义的一个类型
      sstream strm(s); strm是一个sstream对象。保存string s的一个拷贝。此构造函数是explicit的
      strm.str() 返回strm所保存的string的拷贝
      strm.str(s) 将string s拷贝到strm中,返回void
    • 使用

    string line;
    getline(cin,line);
    istringstream record(line);//将记录绑定到刚读入的行
    //record>>line
    ostringstream bad;
    bad<<line;//将line字符串写入bad中
    
  • 相关阅读:
    创建Graphics对象与Pen对象
    GDI+图形图像处理技术——GDIPlus绘图基础
    WPF的组成架构
    文件监控只FileSystemWatcher控件
    文件夹选择之FolderBrowserDialog控件
    SaveFileDialog控件
    文件选择之OpenFileDialog控件
    编码与解码
    写一个翻译小工具
    【转】字符集与字符编码简介
  • 原文地址:https://www.cnblogs.com/ysjcqs/p/cppnote4.html
Copyright © 2011-2022 走看看