文章目录

  • 前言
  • 一、IO类
  • 二、文件输入输出
  • 1.fstream的操作
  • 2.文件模式
  • 三、String流



前言

C++语言本身没有输入输出,而是通过定义在标准库中的类型来处理IO,这些类型支持从文件,控制台窗口读写数据,还有一些类型允许从内存IO中读写数据。


提示:以下是本篇文章正文内容,下面案例可供参考

一、IO类

1.IO库头文件和类型

1)、头文件iostream:从流读数据(istream,wistream),向流写数据(ostream,wostream),读写流(iostream,wiostream);

2)、头文件fstream:从文件 读数据(ifstream,wifstream),向文件写数据(ofstream,wofstream),读写文件(fstream,wfstream);

3)、头文件sstream:从string读数据(istringstream,wistringstream),向string写数据(ostringstream,wostringstream),读写 string(stringstream,wstringstream);

提示:带w字符开头的类型支持宽字符的输入输出。

2.IO对象不能被赋值,拷贝

fstream fs1,fs2;
fs1 = fs2; //错误,IO类型不能被赋值
void print(const ostream os); //错误声明,IO类型不能进行值传递,且不能声明为const类型,因为流的状态会改变;
//正确的声明
void print(ostream& os);
void print(ostream* os);

3.流的条件状态

//流的条件状态类型
strm::iostate // strm是一直IO类型,iostate是一种机器相关的类型,提供了表达条件状态的完整功能
//流的条件状态
strm::badbit // 指出流已崩溃
strm::failbit // 指出IO操作失败了
strm::eofbit // 指出流到达了文件结束
strm::goodbit // 指出流未处于错误状态。此值保证为零
//关于流状态的函数
fstream fs; //读写文件的流
fs.eof(); // 若流的eof被置位,返回true
fs.fail(); // 若流的failbit或badbit被置位,返回true
fs.bad(); // 若流的badbit被置位,返回true
fs.good(); // 若流处于有效状态,返回true
fs.clear(); // 将所有的条件状态复位,使流的状态置为有效,返回void
fs.clear(flags); // flags为条件状态标志位,将流对应条件状态位复位,返回void
fs.setstate(flags); // 将flags置位,返回void
fs.rdstate(); // 返回s的当前条件状态,返回值类型为strm::iostate

当流处于badbit状态时,流就无法使用了;如果流发生读字符错误时,属于流的操作失败了,在一定情况下可以被修复,则流可以继续使用;当达到文件结束位置,eofbit和failbit被置位;

3.管理输出缓冲

//每个输出流都管理一个缓冲区,来保存程序读写的数据
//导致缓冲刷新(即数据真正写到输出设备或文件)
//1)程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行;
//2) 缓冲区满时,需要刷新缓冲,而后新的数据才能被写到缓冲区
//3) 使用endl显示刷新缓冲区
cout << "hello world" << endl;
//4) 使用操作符unitbuf来设置流的内部状态,刷新缓冲区,默认cerr是设置unitbuf的
cout << unitbuf; // 该语句之后所有的输出都会立即刷新缓冲区
cout << nounitbuf; // 恢复正常的缓冲方式
//5) 一个输出流可能被关联到另外一个流,当读写被关联的流时,关联到的流的缓冲区会被刷新,默认cerr,cin都关联到cout,只能将输入流关联到输出流
istream.tie(); // 返回指向输出流的指针,如果该输入流关联到一个输出流,就返回该输出流的指针,否则返回空指针
istream.tie(&ostream); // 将istream关联到ostream
cerr.tie(&cout); // 一个输出流可以被多个流关联,每个流最多关联一个输出流
cout.tie(&cin); // 错误,输入流不能被关联
cin.tie(&cout); // cin关联到cout,任何从cin读取数据的操作都会先刷新cout

二、文件输入输出

1.fstream的操作

代码如下:

fstream fs; // 创建一个文件流,没有绑定任何文件;
fstream fs(filepath); // 创建一个文件流,并绑定一个指定路径的文件,并打开文件。这些构造函数是explicit的,文件名可以是string或者C风格字符串;
fstream fs(filepath,mode); // 创建一个文件流,并按指定mode打开文件;
fs.open(filename); // 打开文件,并与之绑定,返回void,如果成功,goodbit被置位,否则failbit被置位;
//当一个fstream对象被销毁时,close自动被调用。 
fs.close(); // 关闭与fs绑定的文件,返回void,如果需要重新绑定另外一个文件,需要先关闭之前的文件再绑定;
fs.is_open(); // 如果与fs绑定的文件被打开,就返回true;

2.文件模式

代码如下:

fstream::in // 读模式打开文件
fstream::out // 写模式打开文件
fstream::trunc // 每次写模式打开文件时会清空文件内容
fstream::app // 每次写模式打开文件时,将写操作定位到文件末尾,并不会清空文件内容
fstream::ate // 每次以任意模式打开文件时,将操作立即定位到文件末尾
fstream::binary // 以二进制方式进行IO
ifstream ifs(filepath,fstream::in);//读文件流,默认以in模式来打开文件 
// 只要写文件流才能指定trunc 或app模式,trunc,app模式只能指定一个;
ofstream ofs(filepath,fstream::app); // 文件以out模式打开文件,并且每次写操作都定位到文件末尾
ofstream ofs(filepath,fstream::out | fstream::trunc); // 文件每次被打开时,都会清空原来文件的内容;
ofstream ofs(filepath,fstream::out); // 写文件流,默认是out模式打开文件,如果没有指定app模式,打开的文件会被截断(即重新打开文件时里面的内容会被清除)
fstream fs(filepath,fstream::in | fstream::out); // 读写文件流,默认是in,out模式打开文件
ofs.open(filepath); // 没有指定模式时,以默认模式打开文件




三、String流

1.stringstream流的特有操作

sstream strm; // 声明定义一个sstream类型的对象,没有绑定任何string
sstream strm(s); // 将strm与一个为string类型的对象绑定,此构造函数是explict的
strm.str();  //返回strm所保存的string的拷贝
strm.str(s); //将string s 拷贝到strm 中,返回void

2.sstringstream的读写操作

string s = "asdfadf";
sstringstream strings(s);
strings << "helloworld" ; // s == "asdfadfhelloworld"
string s2;
strings >> s2; // s2 == "asdfadfhelloworld";