C++标准库笔记:13.5 标准I/O函数
2017-05-29 17:58
218 查看
前言
同读写格式化数据的>>,<<操作符不同,使用Stream成员函数读取数据时,不跳过起始空格。
处理异常不同:使用成员函数,如果在读取期间,发生异常,不论源自某个被调用函数(比如在getline函数内部调用的某函数抛出异常),还是某个标志位被设立,badbit标志均会被设立。(注:成员函数内部实现中应该有一个捕捉异常的代码,在catch里面再做进一步的操作,如设立状态位badbit)
输入用的成员函数
常用函数
成员函数 | 读取,直到… | 字符数 | 添加结束符号’\0’ | 返回值 |
---|---|---|---|---|
get( s, num) | 不包含new line或EOF | 最多num-1 | 是 | istream |
get( s, num, t) | 不包含t或EOF | 最多num-1 | 是 | istream |
getline( s, num ) | 包含new line或EOF | 最多num-1 | 是 | istream |
getline( s, num, t) | 包含t或EOF | 最多num-1 | 是 | istream |
read( s, num ) | EOF | num | 否 | istream |
readsome( s, num ) | EOF | 最多num | 否 | count |
get( s, num, t )和
getline(s, num, t )中的t表示自定义的终止符
以下表格中函数说遇到EOF会停止读取,但用cin做测试时,如下:
char szBuff[8] = { 0 }; while( cin.get( szBuff, sizeof(szBuff) ) ) { cout << szBuff << endl; }
然后输入:abc(Ctrl + Z)(Enter) ,但是并没有输出内容,
原因:在wondow下Ctrl+Z必须是每次输入流的第一个,否则会被当成无意义的字符,参考https://stackoverflow.com/questions/25766486/c-issue-with-cin-and-ctrl-z
get(s, num)与
get(s, num, t)读取时遇到结束符,停止读取,并且不读取结束符(new line 或EOF或t),即结束符会遗留在流中,下面做个测试
char szBuff[8] = { 0 }; while( cin.get( szBuff, sizeof(szBuff), 'e' ) ) { cout << "current read string: " << szBuff << endl; //打印此时流中的第一个字符 //peek成员函数返回下一个被读取的字符,但不从流中取出 cout << "next read character is '" << char(cin.peek()) << "'" << endl; //此处忽略两个无用字符,即'e''\n',使下一次正常读取 cin.ignore( 2 ); }
getline(s, num)和
getline(s,num, t),读取时遇到结束符,停止读取,并且会读取结束符(new line 或EOF或t),但这结束符不储存于s中,直接丢弃,下面也做个测试:
char szBuff[8] = { 0 }; while( cin.getline( szBuff, sizeof(szBuff), 'e' ) ) { cout << "current read string: " << szBuff << endl; //打印此时流中的第一个字符 //peek成员函数返回下一个被读取的字符,但不从流中取出 //其中'\n'的ASCII为10,字符'e'被读取并丢弃了 cout << "next read character is " << cin.peek() << endl; //此处忽略1个无用字符,即'\n',使下一次正常读取 cin.ignore( 1 ); }
read函数在正常读取的情况下,会一直读取num个字符,如果流中无num个字符,则会阻塞等待,直到读够num个,才返回;
readsom则不会阻塞等待,从当前流中读取<=num个字符,即刻返回,若一个字符都没有,就读取失败。注意:这两个函数不在字符串后面加结束符号’\0’。
其它函数
streamsize istream::gcount返回上次非格式化读取的字符个数
istream& istream::ignore函数,从流中读取字符并丢弃
int istream::peek()返回流中下一个将被读取的字符
istream& istream::unget()、
istream& istream::putback把上一次读取的字符放回流
tellg与
seekg函数主要和文件连用,之后再讲述
输出用的成员函数
ostream& ostream::put( char c ): 写入一个字符
ostream& ostream::write( const char* str, streamsize count):写入count个字符
ostream& ostream::flush():把所有缓冲区数据强制写入其所属设备
建议
使用Stream的成员函数,同格式化函数(operator<<、operator>>)一样,在其内部会产生一个sentry(岗哨)对象(此对象的构造函数负责在使用流操作前进行预处理,析构函数负责对应后的处理),会带来一些开销。而直接运用stream buffer或stream buffer相应的迭代器(如ostreambuf_iterator)进行“非格式 化流操作”,性能会更高。(注:stream buffer之后章节会讲到)相关文章推荐
- Python学习笔记(三)-标准内建函数
- C++标准库笔记:13.12.3 以辅助函数完成I/O
- C++ 学习笔记 1.0 : 基本语言(变量和基本类型,标准库类型,表达式,语句,函数,标准IO库)
- C++标准库笔记:13.12.4 以非格式化函数完成自定义IO操作符
- C++学习笔记1(结构体,命名空间,标准输入输出,引用,函数,构造函数)
- [学习笔记]通过open函数改变标准输出的方法
- [转载]SQlite 常用函数学习笔记
- php学习笔记--php常用函数及其应用(未完成)
- Oracle分析函数学习笔记1
- C++ Template学习笔记之函数模板(4)——显式模板实参
- 关于函数重载解析笔记001
- Win32函数使用笔记
- C++ Template学习笔记之函数模板(5)——模板编译模式
- Oracle分析函数学习笔记3
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++ Template学习笔记之函数模板(3)——模板实参推演
- 标准C++库的原子操作函数
- 数据操作相关函数笔记
- [J2EE学习笔记01]配置标准的J2EE开发环境
- 还是继续支持标准开发,再送一个页面加入FLASH的通用函数