zoukankan      html  css  js  c++  java
  • C++ IO 详细用法

    http://www.cnblogs.com/keam37/ keam所有 转载请注明出处

    本文将分别从<iostream>,<sstream>,<fstream>,<iomanip>4个头文件介绍包含在其中的函数的用法.

    #inclde<iostream>

        cin,cout,cerr是最基本的输入输出流 ,通过运算符"<<"和 “>>”操作

        例如从键盘读入两个字符串,再将其合并输出

    string s1,s2;
    
    cin>>s1>>s2;
    
    cout<<s1+' '+s2;
    
    if(!cin)
    
    cerr<<"input error";

      运行输入为 :

    Hello

    keambar

      则会输出:

    Hello keambar

    如果直接输入文件结束符   ctrl+z

            则会输出 “input error”

    这里与if(!cin) 有关的是操纵流的条件状态

    有以下几种状态(flag)

    badbit           代表流已经崩溃

    failbit            表示一个IO操作失败

    eofbif           表示流到达文件结束

    goodbit       值为0, 表示没有错误

    定义 istream s;//s是一个输入流

    s.bad()               对应badbit,如果badbit置位,返回true;

    s.eof()                对应eofbit状态,如上;

    s.fai()                 对应failbit,如上;

    s.good()            对应goodbit,如上;

    s.clear()             复位所有错误状态,如果加上参数如s.clear(failbit)则仅复位failbit;

    s.setstate(flag)  将流s的状态复位为给定状态;

    s.rdstate()          返回当前s流的状态,返回值为 flag;

    下面的例子来自C++primer:

    auto old_state = cin.rdstate(); //记住cin的当前状态
    
    cin.clear(); //使cin有效
    
    process_input (cin); //使用cin
    
    cin.setstate (old_state) ; //将cin置为原状态

    如果程序崩溃,输出缓冲区将不会刷新,可能导致不会输出程序执行结果.

    刷新输出缓冲区的方法

    cout<<”hi”<<endl;  输出字符串加上换行,然后刷新;

    cout<<”hi”<<flush;输出字符串,然后刷新;

    cout<<”hi”<<ends;输出字符串加上一个空字符,然后刷新;

       unitbuf 操作符

       cout<<unitbuf //所有输出操作后都会立即刷新;

       cout<<nounitbuf //取消上述操作

    关联输入和输出流

    默认情况下 cin和cerr 都关联到cout,因此读cin或写cerr 都会刷新cout;

    x.tie(&O)             将x关联到输出流O;

    x.tie()                   返回x当前关联的输出流指针,若没有关联到输出流则返回空指针;

    其他操作

    cout.put(char ch)                                             //将字符ch加入输出流

    cin.putback(char ch)                                      //将字符ch加入输入流;

    cin.get(char *s,streamsize num,char delim)//从cin流读入字符串,从字符串的首指针,长度为num,或读到 delim结束,第三个参数可不带

    getline(cin,string s,char delim)                   //从cin流读入一行,放入字符串中,遇到行结束或读到delim结束,默认delim=‘ ’

    cin.ignore( streamsize num=1, int delim ); //从cin流读入数,长度为num,或读到delim结束,默认为换行;

     

    //在使用get后可以使用 cin.gcount( )返回 已经读入的字符数

        例如

    char c[10];
    
    cin.get ( &c[0], 9 );
    
    cout << c << endl;
    
    cout << cin.gcount( ) << endl;
    

    /*==============================/*

    #include<sstream>

      stringstream s;//定义一个字符串流s

      stringstream s(“keambar”);//定义一个已近写入”keambar”的字符串流;

         s>> 从字符串s读入数据

         s<<将字符写入s;

      sstream操作虽然简单,但十分实用,具体用法和方便之处自行体会 :)

    <iostream>大部分输入输出操作都可以对stringstream使用

    /*==============================/*

    #inclde<fstream>

        ifstream read("in.txt");    //打开文件in.txt
        ofstream write("out.txt");//打开文件out.txt 若无则将创建

       read>>    //从文件读入

       cout<<    //输出到文件

       read.close();// 关闭与read绑定的文件;

       read.open("in2.txt");//重新将read与in2.txt绑定;

       read.is_open()//返回bool值,指出与s绑定的文件是否已近打开;

    文件模式(mod)s.open(文件名,mod)

      in                 以读方式打开

      out              以写方式打开

      app             每次写操作定位到文件末尾

      ate               打开后定位到文件末尾

      trunc           截断文件

      binary          以二进制方式打开

    默认使用oftream    以out方式打开,并且截断文件,要保留原内容需要用app模式

    下面内容来自文档     seekg()/seekp()与tellg()/tellp()的用法详解

    seekg()/seekp()与tellg()/tellp()的用法详解

    对输入流操作:seekg()与tellg()

    对输出流操作:seekp()与tellp()

    下面以输入流函数为例介绍用法:

    seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。

    对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。

    而第二个参数可以是:

    ios::beg:表示输入流的开始位置

    ios::cur:表示输入流的当前位置

    ios::end:表示输入流的结束位置

    tellg()函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。

    其他操作

    peek()  //peek函数用于读取并返回下一个字符,但并不提取该字符到输入流中,也就是说,依然让该字符作为将要提取到输入流的下一个字符。

    例如下面来自 http://www.cplusplus.com/reference/istream/istream/peek/的例程

    // istream::peek example
    
    #include <iostream> // std::cin, std::cout
    
    #include <string> // std::string
    
    int main () {
    
    	std::cout << "Please, enter a number or a word: ";
    
    	char c = std::cin.peek();
    
    	if ( (c >= '0') && (c <= '9') )
    
    	{
                  int n;
    
    		std::cin >> n;
    
    		std::cout << "You entered the number: " << n << '
    '; 15
    	}
    	else
    	{
    
    		std::string str;
    
    		std::getline (std::cin, str);
    		
    		std::cout << "You entered the word: " << str << '
    ';
    	}
    	return 0;
    
    }

    cin.read(char* buffer, streamsize num ) //按字节读入

    cin.write(const char* buffer, streamsize num )//按字节输出

    例如

    struct {
    
           int height;
    
    	int width;
    
    } rectangle;
    
    input_file.read ( (char *) (&rectangle), sizeof (rectangle) );
    
    if ( input_file.bad() ) {
    
    	cerr << "Error reading data" << endl;
    
    	exit ( 0 );
    
    }
    

    /*==============================/*

    #inclde<iomanip>

    涉及到格式化输出,不仅仅使用<iomanip>头文件,也将包含<iostream>

    <iostream>中有

    cout.fill(char ch)                         // 将填充字符设置为 ch

    cout.fill()                                     //返回当前填充字符

    cout.width(int k)                       //将输出宽度设置为k,设置仅对下次输出有效

    例如

    cout << 32 << endl;
    
    cout.width (5);
    
    cout << 32 << endl;
    
    cout << 32 << endl;
    
    cout.fill ('#');
    
    cout.width (5);
    
    cout << 32 << endl;
    
    cout << cout.fill() << endl;
    

    将输出

    32
           32
    32
    ###32
    #

    cout.flags()         //返回int值,表示当前格式

    cout.precision(int k) //保留k位有效数字,不加参数返回int值,表示当前设置

    cout.setf(ios::   )  //开启格式 flag

    ios格式

    boolalpha          //按bool值输出"true" 或 "false".

    dec                     //以10进制输出.

    hex                    //以16进制表示整数.

    oct                   //以8进制表示整数

    fixed                  //将符点数按照普通定点格式处理(非科学计数法)

    internal            //在符号位和数值的中间插入需要数量的填充字符以使串两端对齐

    left                   //在串的末尾插入填充字符以使串居左对齐

    right                //在串的前面插入填充字符以使串居右对齐

    scientific        // 将符点数按照科学计数法处理(带指数域)

    showbase      //为整数添加一个表示其进制的前缀

    showpoint     //在浮点数表示的小数中强制插入小数点(默认情况是浮点数表示的整数不显示小数点)

    showpos        //强制在正数前添加+号

    skipws            //忽略前导的空格

    unitbuf           //前面已近介绍过,在插入(每次输出)操作后清空缓存

    uppercase     //强制大写字母

    下面来自http://www.cnblogs.com/devymex/archive/2010/09/06/1818754.html

    更多操作也可参考其中

    以上每一种格式都占用独立的一位,因此可以用“|”(位或)运算符组合使用。调用setf/unsetf或flags设置格式一般按如下方式进行:

    cout.setf(ios::right | ios::hex); //设置16进制右对齐

    cout.setf(ios::right, ios::adjustfield); //取消其它对齐,设置为右对齐

    setf可接受一个或两个参数,一个参数的版本为设置指定的格式,两个参数的版本中,后一个参数指定了删除的格式。三个已定义的组合格式为:

    • ios::adjustfield  对齐格式的组合位
    • ios::basefield  进制的组合位
    • ios::floatfield  浮点表示方式的组合位

    另外

             cout.flag的操作有如下用法

    int number = 32;
    cout.setf (ios::showbase); //设置为显示进制前缀
    //setw()函数在<iomanip>中,包括直接使用<<hex
    cout << setw (6) << hex << 32 << setw (6) << oct << 32 << endl; 
    cout << number << endl;//此时输出按照最近一次输出的格式输出
    auto p = cout.flags();//用p记录当期的格式 cout.unsetf(ios::oct);//取消8进制输出
    cout << number << endl;
    cout.flags (p); //设置为格式p
    cout << number << endl;
    return 0;
    

    输出为

    0x20    040
    040
    32
    040

    参考资料 c++ primer,c++ Reference

  • 相关阅读:
    有关Angular 2.0的一切
    后Angular时代二三事
    构建单页Web应用
    用JS渲染的单页面应用其实性能还是比较差的
    给一位打算从事前端,但是又有疑惑的在校大学生的回信
    企业文化与价值观 — 给新员工的一封信
    老码农的技术理想
    (OK) install vmware12 in fedora23
    ECMAScript——wikipedia
    《ECMAScript 6入门》——JavaScript
  • 原文地址:https://www.cnblogs.com/keam37/p/3749186.html
Copyright © 2011-2022 走看看