C++IO库的基本操作

第八章 IO库

IO类

IO库读写标准类型

  • iostream
    • istream wistream 从流读取数据
    • ostream wostream 向流写入数据
    • iostream wiostream 读写流
  • fstream
    • ifstream wifstream 从文件读取数据
    • ofstream wostream 向文件写入数据
    • fstream wfstream 读写文件
  • sstream
    • istringstream wistringstream 从string读取数据
    • ostringstream wostringstream 向string写入数据
    • stringstream wstringstream 读写string
  • 关系: 继承机制
    • 可以像使用istream对象一样来使用ifstream和istringstream,使用istream的cin>>读取数据,我们也可以使用ifstream和istringstream的cin>>从他们对象中读取数据
    • 可以像使用ostream对象一样来使用ofstream和ostringstream,使用ostream的cout<<写入数据,我们也可以使用ofstream和ostringstream的cout<<往对象写入数据

条件状态

  • iostate提供了条件状态的功能

    iostate状态数值:

  • badbit:表示流已崩溃的状态;默认iostate值为 4

  • failbit:表示流的IO操作失败;默认iostate值为2

  • eofbit:表示流到达文件或读取的末尾;默认iostate值为1

  • goodbit:表示流操作正常;默认iostate值为0(没有消息就是最好的消息)

    函数:

  • bad:检测是否触发(置位)badbit,如果触发,则返回true

  • fail:检测是否触发(置位)failbit或者badbit,如果触发,则返回true

  • eof:检测是否触发(置位)eofbit,如果触发,则返回true

  • good:流处于有效状态,返回true

  • clear:所有状态清零(复位),置为有效

  • clear(flags):指定流的flags条件清零,其他不变

  • setstate(flags):指定流的flags条件清零,其他不变

  • rdstate:返回当前流状态,iostate值

示例:

goodbit表示输入正确,没有遇到错误 goodstate置为 1

cin >> num;
cout << "goodstate: " << cin.good() << ", goodbit: " << cin.goodbit << endl;
cout << "failstate: " << cin.fail() << ", failbit: " << cin.failbit << endl;
cout << "eofstate: " << cin.eof() << ", eofbit: " << cin.eofbit << endl;
cout << "badstate: " << cin.bad() << ", badbit: " << cin.badbit << endl;
cout << num << endl;

在这里插入图片描述

badbit表示系统级错误,触发条件很低

eofbit表示遇到结尾或者结束字符:^Z是windows的输入结束(CTRL+Z)触发eofbit,会同时触发failbit和eofbit
在这里插入图片描述

failbit表示输入错误:a字母不是int型,触发failbit
在这里插入图片描述

  • 管理条件状态: 测试案例

    • rdstate:记录

    • setstate:复位

    • clear:清除

      void iostate_test(istream& in) {
      	// 流状态打印
      	cout << "goodstate: " << in.good() << ", goodbit: " << in.goodbit << endl;
      	cout << "failstate: " << in.fail() << ", failbit: " << in.failbit << endl;
      	cout << "eofstate: " << in.eof() << ", eofbit: " << in.eofbit << endl;
      	cout << "badstate: " << in.bad() << ", badbit: " << in.badbit << endl;
      	cout << endl;
      }
      void Input_Test() {
      	int value;
      	while (cin >> value) {
      		iostate_test(cin);
      	}									//假设触发eofbit错误 
      
      	auto old_state = cin.rdstate();			// 记录当前错误状态
      	iostate_test(cin);
      
      	cout << "清除全部错误:\n";
      	cin.clear();						// 流状态复位,即错误位全部清除,恢复正常
      	iostate_test(cin);
      
      	cout << "清除failbit错误:\n";
      	cin.setstate(old_state);					// 还原错误,导致eofbit置位
      	cin.clear(cin.rdstate() & ~cin.failbit);	// 流状态复位,failbit复位,但不会复位其他状态
      	iostate_test(cin);
      
      	cout << "清除failbit和eofbit错误:\n";
      	cin.setstate(old_state);					// 设置错误,导致eofbit置位
      	cin.clear(cin.rdstate() & ~cin.failbit & ~cin.eofbit); // 流状态复位,failbit和badbit复位
      	iostate_test(cin);
      
      	cout << "还原原始eofbit错误:\n";
      	cin.setstate(old_state); // 设置为原来错误状态,导致failbit和eofbit置位
      	iostate_test(cin);
      
      	int temp = 0;
      	return;
      }
      int main()
      {
      	Input_Test();
      	return 0;
      }
      
      

在这里插入图片描述

管理缓冲区

  • unibuf:在每次输出操作后都刷新缓冲区
  • nounitbuf:使其恢复正常
  • tie:关联输入流和输出流

文件输入输出

使用文件流对象:

  • 加上 include 头文件

  • 对要求使用基类对象的地方,可以用继承类型的对象来调用,例如在istream&的地方传递ifstream;在ostream&的地方传递ofstream

  • 成员函数open和close:open打开文件,失败返回failbit状态,要进行open的检查操作,close关闭文件**,操作完一个文件后一定要关闭**

文件的模式

  • in:读模式

  • out:写模式

  • app:每次写操作前定位到文件末尾

  • ate:打开文件后立刻定位到文件末尾

  • trunc:截断文件

  • binary:二进制形式进行IO

    注意:

  • 保存ofstream原有内容的唯一方式:显式指定app或者in模式

  • 每次文件open时如果不指定模式,则对于ofstream,自动输出和截断文件

    ifstream in(argv[1]);
    ofstream out(argv[2],ios_base::app);	//指定追加与输出
    

string流

  • str:返回istring stream的拷贝

  • str(s):将string s拷贝到istringstream中

  • 使用istringstream:头文件 include 从istringstream读取数据

    	istringstream in("546 5 9 5 da我爱你 hhhh");
    	int a;
    	while (in >> a)
    	{
    		cout << a << " ";
    	}
    	cin.clear();
    
  • 使用ostringstream:向ostringstream对象输出数据:

    	ostringstream outstring;
    	outstring << "我爱你" << endl;
    	cout << outstring.str() << endl;
    

    源代码链接

 一、ASCII 输出   为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用取 代,所有的C++标准头文件都是无后缀的。)。这是 的一个扩展集, 提供有缓 冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个 文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O 操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。   如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部 分,首先声明一个类对象。 ofstream fout;   这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。 fout.open("output.txt");   你也可以把文件名作为构造参数来打开一个文件. ofstream fout("output.txt");   这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文 件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操 作很像。 对不了解控制台输出"cout"的人, 这里有个例子。 int num = 150; char name[] = "John Doe"; fout << "Here is a number: " << num << " "; fout << "Now here is a string: " << name << " ";   现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你 不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文 件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样: fout << flush; fout.close();    现在你用文本编辑器打开文件,内容看起来是这样:   Here is a number: 150 Now here is a string: John Doe   很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<>" 比较熟悉了, 因为你接下来还要用到他们。继续…   二、ASCII 输入   输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前 , 先看一个文本:   12 GameDev 15.45 L This is really awesome!   为了打开这个文件,你必须创建一个in-stream对象,?像这样。 ifstream fin("input.txt");   现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuleo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值