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=‘\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
3232
###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
04032
040
参考资料 c++ primer,c++ Reference
C++ IO 详细用法的更多相关文章
- C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法
C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法
装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...
- python可视化库 Matplotlib 01 figure的详细用法
1.上一章绘制一幅最简单的图像,这一章介绍figure的详细用法,figure用于生成图像窗口的方法,并可以设置一些参数 2.先看此次生成的图像: 3.代码(代码中有详细的注释) # -*- enco ...
- 在DOS下的DEBUG命令的详细用法
在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...
- __declspec关键字详细用法
__declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...
- CString.Format的详细用法(转)
CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...
- IFRAM的详细用法
IFRAM的详细用法: IFRAM的详细用法: <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...
- 【转】java.util.vector中的vector的详细用法
[转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...
- DOM Style样式对象的详细用法
DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head> ...
随机推荐
- 在C#中实现软件自动升级
在C#中实现软件自动升级 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的 ...
- 汽车行业的DMS系统 IT不变应万变
DMS是针对4S店的整车销售.零配件仓库.售后维修服务(含车间管理).客服服务涵盖4S店业务进行完整管理的系统,是对销售.维修.客户关系进行一系列的整合.其中,服务的预约.进店接待都有着跟踪处理,客户 ...
- 博客转移到lyso.me
博客转移到http://lyso.me :)
- SQL 查询横表变竖表
SQL 查询横表变竖表 /*普通行列转换 假设有张学生成绩表(tb)如下:Name Subject Result张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 ...
- careercup-中等难度 17.4
17.4 编写一个方法,找出两个数字中最大的那一个.不得使用if-else或其他比较运算符. 解法: 我们可以通过一步步的分析来将需要用到的if-else和比较操作符去掉: If a > b, ...
- [012]泛型--lambda表达式捕获
lambda表达式的捕获跟参数差不多,可以是值或者引用. 1.值捕获 与传值参数类似,采用值捕获的前期是变量可以拷贝:与参数不通透的是:被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝. ...
- struts2 CRUD 入门 配置
本文介绍struts2在eclipse下的配置,实现一个具有CRUD功能的图书管理系统. 1 开发环境配置 1.1 在Eclipse中配置Struts2 1.1.1 ...
- JAVA_Reflection
package com.qf.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; imp ...
- Time complexity analysis of algorithms
时间复杂性的计算一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少.设一个程序P所占用的时间为T,则 T(P)=编译时间+运行时间. 编译时间与实例特征是无关的,且可假设一个编译过的 ...
- uiautomator日志文件转换为xml格式文件
如果想把uiautomator的日志文件,转换成漂亮的xml文件,那么可以使用automator-log-converter.jar工具, 工具使用方法: 使用工具automator-log-conv ...