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=‘\n’

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 << '\n'; 15
}
else
{ std::string str; std::getline (std::cin, str); std::cout << "You entered the word: " << str << '\n';
}
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

C++ IO 详细用法的更多相关文章

  1. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  2. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  3. python可视化库 Matplotlib 01 figure的详细用法

    1.上一章绘制一幅最简单的图像,这一章介绍figure的详细用法,figure用于生成图像窗口的方法,并可以设置一些参数 2.先看此次生成的图像: 3.代码(代码中有详细的注释) # -*- enco ...

  4. 在DOS下的DEBUG命令的详细用法

    在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...

  5. __declspec关键字详细用法

    __declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...

  6. CString.Format的详细用法(转)

    CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...

  7. IFRAM的详细用法

    IFRAM的详细用法:   IFRAM的详细用法:  <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...

  8. 【转】java.util.vector中的vector的详细用法

    [转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

  9. DOM Style样式对象的详细用法

    DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head>     ...

随机推荐

  1. ECshop数据库的访问统计和管理员日志的清空

    ECshop是个不错的系统,但是它有一定漏洞,若是访问量巨大的话,大量的访问统计代码会存入数据库的ecs_stats表中,甚至几天就可以达到几百兆,严重的网站直接就崩溃了.数据备份的时候也有很多不便, ...

  2. jeasyUI属性列表

    属性分为CSS片段和JS片段. CSS类定义:1.div easyui-window        生成一个window窗口样式.      属性如下:                   1)mod ...

  3. zigbee 学习记录之一:资料搜索

    先从网络来一段资料吧,在学习过程中慢慢整理资料. <由于zigbee 以cc2530 51单片机为基础,Zstack为源头,比较成熟了,学习和摸索就从Zstack开始吧.没有师傅,就有从网络上大 ...

  4. IPv6介绍

    一.为什么需要IPv6 为了扩大地址空间,拟通过IPv6重新定义地址空间.IPv4采用32位地址长度,只有大约43亿个地址,估计在2005-2010年间将被分配完毕,而IPv6采用128位地址长度,几 ...

  5. WINAPI 变量(2861个)

    WINAPI 变量(2861个)   这是从 c:\Program Files\Windows Kits\8.1\Include\um\WinUser.h 这个文件 中提取的 CTRL+F 查看变量所 ...

  6. PCL 点云数据操作 OpenCV遍历数据

    1.对于点云类型实例cloud,对其第i个点进行赋值操作,使用cloud.point[i].x 和 cloud.point[i].y 和cloud.point[i].z 分别对其XYZ坐标赋值. cl ...

  7. 匿名内部类new Runnable()

    匿名内部类(Anonymous Inner Class),在创建实例的同时给出类的定义,所有这些在一个表达式中完成. Java code? 1 2 3 4 Runnable rn = new Runn ...

  8. 反射---Java高级开发必须懂的

        理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助.  一.Class类的使用         1.万事万物皆 ...

  9. net.ipv4.tcp_tw_recycle

    原创 2016-03-07 CFC4N 运维帮 本文为翻译英文BLOG<Coping with the TCP TIME-WAIT state on busy Linux servers> ...

  10. 分享SVN的钩子代码[借鉴学习]pre-commit-post 钩子

      #/bin/bash REPOS=$1 TXN=$2 export HOME=/ export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/us ...