您的位置:首页 > 编程语言 > C语言/C++

C++IO类&文件输入输出

2017-09-13 20:59 267 查看

C++IO类&文件输入输出

作者:tongqingliu

转载请注明出处:http://www.cnblogs.com/liutongqing/p/7072878.html

觉得有帮助?欢迎来打赏



istream(输入流)类型,提供输入操作。

ostream(输出流)类型,提供输出操作。

cin,一个istream对象,从标准输入读取数据。

cout,一个ostream对象,向标准输出写入数据。

cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误。

>>
运算符,用来从一个istream对象读取输入数据。

<<
运算符,用来向一个ostream对象写入输出数据。

getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中。

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对象进行拷贝和赋值,所以进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const.

IO库条件状态

IO操作可能会出现错误,以下可以帮助我们访问和操纵流的条件状态。

strm::iostate        strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit         用来指出流已崩溃
strm::failbit        用来指出一个IO操作失败了
strm::eofbit         用来指出流到达了文件结束
strm::goodbit        用来指出流未处于错误状态。此值保证为0
s.eof()              若流s的eofbit置位,则返回true
s.fail()             若流的failbit或badbit置位,则返回true
s.good()             若流s处于有效状态,则返回true
s.clear()            将流s中所有条件状态复位,将流的状态设置为有效。返回void
s.clear(flags)       根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
s.setstate(flags)    根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
s.rdstate()          返回流s的当前条件状态,返回值类型为strm::iostate


查询流的状态

将流作为条件使用,只能告诉我们流是否有效,但无法告诉我们具体发生了什么。

IO库定义了4个iostream类型的constexpr值,表示特定的位模式。这些值用来表示特定类型的IO条件,可以与位运算符一起使用来一次性检测或设置多个标志位。

badbit表示系统级错误,如不可恢复的读写错误。通常情况下,一旦badbit被置位,流就无法再使用了。在发生可恢复错误后,failbit被置位,如期望读取数值却读取了字符等错误。这种问题通常是可以修正的,流还可以继续使用。如果到达文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,表示流还未发生错误。如果badbit、failbit和eofbit任一个被置位,则检测流状态的条件就会失败。

标准库还定义了一组函数来查询这些标志位的状态。操作good在所有错误位均未置位的情况下返回true,而bad,fail和eof则在对应错误位被置位时返回true。此外,在badbit被置位时,fail也会返回true。这意味着,使用good或fail是确定流的总体状态的正确方法。实际上,我们将流当条件使用的代码就等价于!fail()。而eof和bad操作只能表示特定的错误。

fstream特有的操作

fstream fstrm;              创建一个未绑定的文件流
fstream fstrm(s);           创建一个fstream,并打开名为s的文件
fstream fstrm(s, mode);     同上,只不过是以mode模式打开
fstrm.open(s);              打开名为s的文件,并将其与fstrm绑定。返回void
fstrm.close();              关闭与fstrm绑定的文件。返回void(PS:当一个fstream对象被销毁时,close会自动被调用)
fstrm.is_open();            返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭


文件模式

in      以读的方式打开
out     以写的方式打开
app     每次操作前均定位到文件末尾
ate     打开文件后立即定位到文件末尾
trunc   截断文件
binary  以二进制方式进行IO


以out模式打开的文件会丢弃已有数据

示例

demo

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
// 写入文件
ofstream outfile("test.txt");
outfile << "hello world!";
outfile.close();
/*
新建one.txt:
one
one
one
*/
// 读取文件
string file("one.txt");
ifstream infile(file.c_str());
/*
或者
ifstream infile("one.txt");
*/
if (!infile)
{
cerr << "error: unable to open input file:" << file << endl;
return -1;
}
string s;
while (infile >> s)
cout << s << endl;
infile.close();

system("pause");
return 0;
}


程序输出结果:

one
one
one
请按任意键继续. . .


还有一个test.txt

C++primer[5]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: