打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++基础之IO类

 下面是IO类的继承关系:

ifstream和istringstream都继承自istream。因此,我们可以在传递istream对象的地方传递ifstream和istringstream。

例如:对ifstream和istringstream对象调用getline,也可以用>>从ifstream和istringstream读取数据。

类似的ofstream和ostringstream也都继承自ostream。

IO库和头文件如下:

头文件类型
iostream

istream,wistream从流读取数据

ostream,wostream向流写入数据

iostream,wiostream读写流

fstream

ifstream,wifstream从文件读取数据

ofstream,wofstream向文件写入数据

fstream,wfstream读写文件

sstream

istringstream,wistringstream从string读取数据

ostringstream,wostringstream向string写入数据

stringstream,wstringstream读写string

 

IO类定义了一些函数和标志,帮助我们访问和控制流的状态条件。

strm::iostate  strm是指一种IO类型,iostate是一种机器相关的类型,提供表达条件状态的完整功能。

strm::badbit  标志流已崩溃

strm::failbit  标志IO操作失败了

strm::eofbit  标志达到文件结尾

strm::goodbit 流未出现错误状态,此值保证为0

s.eof()     若流s的eofbit置位,则返回true

s.fail()     若流s的failbit或badbit置位,则返回true

s.bad()      若流s的badbit置位,则返回true

s.good()    若流s处于有效状态,则返回true

s.clear()    将流的所有条件复位,状态设置为有效,返回void

s.clear(flags)  根据flags标志位,将s中对应条件状态复位,flags类型为strm::iostate。返回void

s.setstate(flags) 根据flags标志位,将s中对应条件状态置位,flags类型为strm::iostate。返回void

s.rdstate()   返回流的当前条件状态,返回类型为strm::iostate

确定流的状态最简单的方法是把它当做条件来使用。

例如:

while(cin >> n){//while会循环检查输入的状态,成功则保持循环...

注意:

badbit是系统级错误,如不可恢复的读写错误;一般badbit置位了流就无法继续使用。

failbit是可恢复错误,例如希望读取数值,却读取了一个字符,这种错误可以修正,流还可以继续使用。

如果达到文件结束位置,eofbit和failbit都会被置位。

googbit表示流未发生错误,值为0。

只要badbit、failbit、eofbit任意一个被置位,检查流的状态的条件会失败。

auto oldState = cin.rdstate();//记住cin的当前状态cin.clear();//使cin有效process_input(cin);//使用cincin.setstate(oldState);//将cin的状态还原

或者这样使用:

cin.clear(cin.rdstate()&~cin.failbit&~cin.badbit);//只复位failbit和badbit

进行IO操作的函数通常以引用的方式传递和返回流。

每个输出流都管理一个缓冲区,用来保存程序读写的数据。

例如:

cout << "Please input:";

字符串不一定会立刻打印出来,可能保存到缓冲区随后打印,所以有时调试时,没有输出,可以看看自己刷新了缓冲区吗?

如果程序异常终止,缓冲区是不会被刷新的,当一个程序崩溃后,它的输出很可能停留在输出缓冲区中等待打印。

会导致刷新缓冲区的原因:

  • 程序正常结束,作为main函数的return的一部分,缓冲刷新被执行。
  • 缓冲区满,需要刷新缓冲区,而后新的数据才能写入。
  • 使用操纵符:endl来显示刷新缓冲区。
  • 每个输出操作后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,cerr是设置unitbuf的,因此写到cerr中的数据都是立即刷新的。
  • 一个输出流被关联到另一个流,此时,当读写被关联的流时,关联到流的缓冲区会被刷新。默认cin和cerr都关联到cout,因此读cin或写cerr都会导致cout的缓冲区被刷新。

endl  换行并刷新缓冲区;

ends  插入一个空字符并刷新缓冲区;

flush  仅刷新缓冲区

使用tie函数手动关联流:

cin.tie(&cout);//将标准库cin和cout关联到一起//oldTie指向当前关联到cin的流,如果存在的话ostream* oldTie = cin.tie(nullptr);//cin不再与其他流关联cin.tie(&cerr);cin.tie(oldTie);//重建cin与cout的正常关联

 流的操作函数,以istream为例。

istream流 的操作:

1、opeartor>>操作

<<操作返回一个ostream对象的引用,所以可以连续使用


2、get( )

get( )操作:

读取单个字符

返回一个整数

 

get(char&)操作:

读取单个字符

返回一个istream对象的引用

 

3、getline( )

读取一行,遇到回车键返回istream对象的引用

getline()操作与>>的区别:  

char string1 [256],

cin.getline(string1, 256);     //get a whole line, 以'\0'结尾

cin >> string1;    //stop at the 1st blank space

4、read( )

read(buf, len)
返回一个istream对象的引用
对空白字符(包括'\n')照读不误


5、peek( ) 与 putpack()

peek:查看而不读取
putback:将一个字符添加到流

文件流总结

需要包含的头文件: <fstream> 

fstream提供了三个类,用来实现c++对文件的操作。(文件的创建,读写)。
ifstream -- 从已有的文件读

ofstream -- 向文件写内容

fstream - 打开文件供读写

支持的文件类型

实际上,文件类型可以分为两种: 文本文件和二进制文件.

文本文件保存的是可读的字符, 而二进制文件保存的只是二进制数据。利用二进制模式,你可以操作图像等文件。用文本模式,你只能读写文本文件。否则会报错。

 

string流

在sstream头文件中定义了三个类型来支持内存的IO,通过ostringstream可以向string写入数据,通过istringstream从string读取数据,通过stringstream向string读写数据

stringstream特有的操作:

sstream strmstrm是一个未绑定的stringstream对象。
sstream strm(s)strm是一个stringstream对象,保存string s的拷贝。此构造函数是explicit
strm.str()返回strm保存的字符串
strm.str(s)将strm保存的字符串拷贝到string s中,返回void

当对整行文本并处理行内的某个单词进行处理,此时可以使用string流。

istringstream将string转换为int(通常可是直接使用to_string()和stoi(),stol(),stof(),stod()等实现string和数值类型的相互转换)

string s = "123";istringstream isToi(s);//将s绑定到istringstream中int a;isToi >> a;//string输出为intcout << a << endl;

读取某文件中人名和电话号码:

Morgan 1646464648 1164986463

drew 15465463132

struct PersonInfo{    string name;    vector<string> phones;//多个电话号码}//line保存一行的信息string line,word;vector<PersonInfo> people;//读取一行while(getline(cin,line)){    PersonInfo info;    istringstream iss(line);//一行的字符串绑定istringstream    iss >> info.name;//分离出姓名,以空格分离    while(iss >> word)info.phones.push_back(word);    people.push_back(info);}

输出上面的信息,但是不能输出有无效号码的人

for(const auto &info : people){    ostringstream formatted,badNums;//保存格式化信息和无效信息    for(const auto &num : info.phones){        if(!vaild(num))badNums << " " << num;//如果号码无效则保存在内存badNums中        else formatted << " " << num;//否则保存号码到formatted    }    if(badNums.str().empty())//没有无效号码        cout << info.name << " " << formatted.str() << endl;    else        cerr << "input error:" << info.name << " " << badNums.str() << endl;}

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
《C++ Primer》笔记 第8章 IO库
第一部分 基础语言之七标准IO库
cin使用方法
c++标准IO库简介
C++STL之迭代器
java中的FileWriter类和FileReader类的一些基本用法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服