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. Thread学习

    1.定义 2.作用 3.和进程的比较 4.多线程(multithreading)的优点和缺陷 5.调度(scheduling) 6.线程相关概念 定义 线程就是最小的可编程指令序列,是进程的子集.一个 ...

  2. Java Singleton 单例模式

    大家可能还听过 Singleton  也就是单例模式 这个单例模式要求 在程序的运行时候   一个程序的某个类 只允许产生一个 实例 那么 这个类就是一个单例类 Java Singleton模式主要作 ...

  3. Codeforces Round #268 (Div. 1) A. 24 Game 构造

    A. 24 Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/468/problem/A D ...

  4. android内核读取file文件

    内核读取file文件的方法: char* file_read(const char * file_path) { struct file *file = NULL; //保存打开文件的文件指针变量 s ...

  5. jquery处理单击和双击事件

    今天做div点击时,需要用到同一div的单击和双击事件,出现问题如下 例子: Html <body> <div id="div_1">单击双击我</d ...

  6. [React Native] Complete the Notes view

    In this final React Native lesson of the series we will finalize the Notes view component and squash ...

  7. perl dtrace2

    http://search.cpan.org/~chrisa/Devel-DTrace-Provider-1.11/lib/Devel/DTrace/Provider.pm

  8. Android模拟器avd的创建、使用和调试相关命令

    1.创建AVD命令:android-sdk-windows\tools目录下面有android命令  android list 列出当前系统中已安装的Android版本以及已安装的AVD(Androi ...

  9. javascript之css常用属性

    1. position : 属性值有absolute .fixed.relative absolute:生成绝对定位的元素,相对第一父元素进行定位: fixed :   生成绝对定位的元素,相对于浏览 ...

  10. Swift和OC相互调

    在项目中不免会有多中语言开发, 不说别的就我个人而言, 之前一直都是用 OC 写的代码, 封装很多工具类, 而苹果新出来 Swift , 现在项目在向 Swift 过渡, 或者新项目是 Swift , ...