4.未格式化输入和输出函数
- 能够取代标准流操作符的“>>,<<”的部分成员函数一般用于读写无格式数据;
- 通常,读取数据时,不会跳过起始空格,异常处理和格式化io不一样
- 发生意外后,badbit通常会设立
- 若异常掩码中包含badbit,会重新抛出异常,无格式相关函数会产生一个sentry(岗哨)对象。
4.1 输入函数
一下函数是定义在模板类basic_istream的函数:
c++中stl用于读取字符序列的成员函数主要包括:
- get(s,num)
- getline(s,num)
- getline(s,num,t)
- read(s,num)
- readsome(s,num)
说明:
- 输入运算符“>>”会跳过前面的空格,并且ios::skipws标志对”>>”不起作用;
- 要保留空格,需要get()或者getline()
- read()是输入函数,主要和输出函数write()对应;并且所有二进制数据会读入缓冲区,包括空格;
(1)get()的原型
int_type get();(1)
basic_istream& get( char_type& ch );(2)
basic_istream& get( char_type* s, std::streamsize count );(3)
basic_istream& get( char_type* s, std::streamsize count, char_type delim );(4)
basic_istream& get( basic_streambuf& strbuf );(5)
basic_istream& get( basic_streambuf& strbuf, char_type delim );(6)
说明:
1. 第一种: 返回流中读取序列的字符;
2. 第二种:从输入流中读取count-1个字符
3. 第三种: 从输入流中读取count-1个字符,以delim为分隔符
4. 第四种: 从输入流中读取字符序列存放在basic_streambuf对象中
5. 第五种: 从输入流中读取字符序列存放在basic_streambuf对象中,遇到delim或者eof标志结束
例子:
// -------------------省略---------------
char c1=cin.get();
char c2[5] ;
char c3[10];
cin.get(c2,5);
cin.get(c3, 4, ' ');
cout << "c1: "<<c1<< endl;
cout << "c2[5]: "<<c2 << endl;
cout << "c3[10]: " << c3 << endl;
//--------------------省略-------------------
结果为:
1234567 89
c1: 1
c2[5]: 2345
c3[10]: 67
因为c语言风格的字符数组结尾需要’\0’作为结束标志,因此,只能读取n-1个字符;
(2) 函数getline()的原型
basic_istream& getline( char_type* s, std::streamsize count );
(1)
basic_istream& getline( char_type* s, std::streamsize count, char_type delim );
(2)
说明:
1. 第一种: 从输入流中读取count -1 个字符
2. 第二种:从输入流中读取count -1 个字符,或者遇到delim分隔符
3. 两个形式终止条件: 读取count-1个字符,或者遇到文件结尾标志,或者换行符;
例子:
#include <iostream>
#include <sstream>
#include <vector>
#include <array>
//------------------省略------------------
std::istringstream input("abc|def|gh");
std::vector<std::array<char, 4>> v;
for(std::array<char, 4> a; input.getline(&a[0], 4, '|'); ) {
v.push_back(a);
}
for(auto& a : v) {
std::cout << &a[0] << '\n';
}
//-------------------省略-------------------
输出结果为;
abc
def
gh
(3)read函数
函数原型;
basic_istream& read( char_type* s, std::streamsize count );
- 读取count个字符存储在s中;
- 注意: 读入过程中,遇到字符终止符号不会结束,因此字符串s的容量必须大于count
- 但是,如果读取过程中遇到eof标志会出现错误,引发failbit和eofbit被设置。
(4)readsome函数
std::streamsize readsome( char_type* s, std::streamsize count );
- 函数最多可以读取count个字符存入到s中,返回值是读取的字符个数;
读取到字符终止符不会结束。需要确保s的容量大于count。 - 和read()不同,readsome()会读取streambuffer的所有有效字符,遇到eof标志,不会报错;
(5)其他函数
gcount() : 返回一个未格式化读取操作从is读取的字节数
ignore(size,delim) : 读取并忽略size个字符,包括delim,size默认为1,delim默认为文件尾
peek(): 将下一个字节作为int返回,但不从流中删除它
unget(): 将上一次读取的字符重新放回stream中,下一次从输入流读取时读取出来。
putback(ch):将字符放回stream中
tellg() : 返回输入流中标记的当前位置
- seekg() :输入流中从新定位到给定的地址;
4.2 输出函数
(1).单字节写入put()
basic_ostream& put( char_type ch );
将字符写入到流中,返回值状态说明写入是否成功;
(2).多字节写入write()
basic_ostream& write( const char_type* s, std::streamsize count );
将字符串s中的count个字符写入到流中;
1. 字符串的终止符号不会终止写入操作,因此,需要确保字符串中至少包含count个字符,否则导致不可期的行为;
(3) flush函数
basic_ostream& flush();
刷新stream的缓冲区,将所有的缓冲区数据强制写入所属的设备或io中;