七、输入/输出流--IOStreamm基本类和标准IOStream对象--未格式化输入和输出函数

4.未格式化输入和输出函数

  1. 能够取代标准流操作符的“>>,<<”的部分成员函数一般用于读写无格式数据;
  2. 通常,读取数据时,不会跳过起始空格,异常处理和格式化io不一样
  3. 发生意外后,badbit通常会设立
  4. 若异常掩码中包含badbit,会重新抛出异常,无格式相关函数会产生一个sentry(岗哨)对象。

4.1 输入函数

一下函数是定义在模板类basic_istream的函数:

c++中stl用于读取字符序列的成员函数主要包括:

  • get(s,num)
  • getline(s,num)
  • getline(s,num,t)
  • read(s,num)
  • readsome(s,num)

说明:

  1. 输入运算符“>>”会跳过前面的空格,并且ios::skipws标志对”>>”不起作用
  2. 要保留空格,需要get()或者getline()
  3. 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 );
  1. 读取count个字符存储在s中;
  2. 注意: 读入过程中,遇到字符终止符号不会结束,因此字符串s的容量必须大于count
  3. 但是,如果读取过程中遇到eof标志会出现错误,引发failbit和eofbit被设置。
(4)readsome函数
std::streamsize readsome( char_type* s, std::streamsize count );
  1. 函数最多可以读取count个字符存入到s中,返回值是读取的字符个数;
    读取到字符终止符不会结束。需要确保s的容量大于count。
  2. 和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中;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值