目录结构:ios
除了istream和ostream以外,标准库还定义了其它的一些类型。以下表:c++
头文件 | 类型 |
iostream | istream,wistream 从流读取数据app ostream,wostream 向流写入数据函数 iostream,wiostream 读写流spa |
fstream | ifstream,wifstream 从文件读取数据code ofstream,wofstream 向文件写入数据对象 fstream,wfstream 读写文件blog |
sstream | istringstream,wistringstream 从string读取数据seo ostringstream,wostringstream 向string写入数据图片 stringstream,wstringstream 读写string |
为了支持宽字符的语言,标准库还定义了一组类型和对象来操做wchar_t类型的数据。宽字符版本和函数的名字以一个w开始。例如,wcin,wcout和cerr,分别对应cin,cout,cerr的宽字符版本。
下面这种图片更详细的列举了,c++中流的基本体系:
不能拷贝和对IO对象赋值:
fstream out1,out2; out1 = out2; //错误,不能对流对象赋值 ofstream print(ofstream); //错误,不能初始化ofstream参数 out2 = print(out2); //错误,不能拷贝流对象
因为不能拷贝IO对象,所以咱们也不能将形参或返回类型设置为流类型。进行IO操做的函数一般以引用的方式传递和返回流。
C++类提供了一些列的函数和标志,能够帮助咱们访问和操纵流的条件状态,下表列举了一些函数和标志:
strm::iostate | strm流的iostate类静态成员,提供了表达式状态的完整功能 |
strm::badbit | strm流的badbit类静态成员,指出流已经崩溃 |
strm::failbit | strm流的failbit类静态成员,指出流操做失败了 |
strm::eofbit | strm流的eofbit类静态成员,指出流达到了文件末尾 |
strm::goodbit | strm流的goodbit类静态成员,指出流处于正常状态,未发生任何错误 |
s.eof() | 若流s的eofbit置位,则返回true |
s.fail() | 若流s的failbit或badbit置位,则返回true |
s.bad() | 若流s的badbit置位,则返回true |
s.good() | 若流s处于有效状态,则返回true |
s.clear() | 将流s中的全部条件状态位复位,将流的状态设置为有效。 |
s.clear(flags) | 根据给定的flags标志位,将流s中对应的条件状态位复位。flags的类型是strm::flags |
s.setstate(flags) | 根据给定的flags标志位,将流s中的对应条件状态位置位。flags的类型是strm::flags |
s.rdstate() | 返回流s的当前条件状态,返回值类型为strm::iostate。 |
咱们能够使用以下的代码判断流的状态:
std::ifstream strm; if(strm.good()){ //继续操做 }
因为流重载了布尔运算符,
explicit operator bool() const;
若是failbit和badbit被置位,则返回false。不然返回true。
有了布尔运算符,咱们就能够轻松的判断流的状态。
std::ifstream is; is.open ("test.txt"); if (is) { //编译器会编译为if(is.good()) // 操做文件 } else { std::cerr << "Error opening 'test.txt'\n"; }
头文件fstream定义了三个类型来支持文件IO,ifstream从一个给定的文件读取数据,ofstream从一个向一个给定的文件写入数据,以及fstream能够读写文件。
读写文件的步骤:
1.建立文件流对象
2.打开文件
3.读写数据
4.关闭文件
例如:
#include <fstream> // std::fstream int main () { std::fstream fs;//建立对象 fs.open ("test.txt");//打开文件 fs << " more lorem ipsum";//写入数据 fs.close();//关闭文件 return 0; }
每一个流都有一个关联的模式,用来指出如何使用文件。例如:
in | 以读的方式打开 |
out | 以写的方式打开 |
app | 每次写操做前均定位到文件末尾 |
ate | 打开文件当即定位到文件末尾 |
trunc | 截断文件 |
binary | 以二进制方式进行 |
当打开一个文件的时候,能够指定一个文件模式,指定模式有以下限制:
1.只能够对ofstream或fstream对象设定out模式
2.只能够对ifstream或fstream对象设定in模式
3.只有当out模式被设定时才能够设定trunc模式
4.只要trunc没有被设定,就能够设定app模式。在app模式下,即便没有显式指定out模式,文件也老是以输出方式打开。
5.默认状况下,即便咱们没有指定trunc模式,以out模式打开的文件也会被截断。为了保留以out模式打开的文件的内容,咱们必须同时指定app模式,这样只会将数据追加到文件末尾;或者同时指定in模式,即打开文件同时进行读写操做
6.ate和binary模式能够用于任何类型的文件流对象,且能够与其余任何文件模式组合使用。
每一个文件流都有一个默认的文件模式,ifstream关联的文件默认以in模式打开,ofstream关联的文件默认以out模式打开,fstream关联的文件默认以in和out模式打开。
例如:
ofstream out; // 未指定文件打开模式 out.open("test.txt"); // 模式隐含设置为输出和截断 out.close(); // 关闭out out.open("test2.txt",ofstream::app); //模式为输出和追加 out.close(); //关闭out
sstring头文件定义了三个类型来支持内存IO操做,这些类型能够向string写入数据,从string读取数据,就像string是一个IO流同样。
istringstream从string读取数据,ostringstream向string写入数据,stringstream既能够向string写入数据也能够向string读取数据。
下面是关于stringstream的常规操做:
sstream strm | 是一个未绑定的stringstream对象 |
sstream strm(s) | strm是一个stringstream对象,保存了string s的拷贝。 |
strm.str() | 返回strm所保存的string的拷贝 |
strm.str(s) | 将string s拷贝到stream中 |
例如:
#include <string> // std::string #include <iostream> // std::cout #include <sstream> // std::stringstream, std::stringbuf int main () { std::stringstream ss; //建立stringstream对象 ss.str ("Example string"); //将字符串拷贝到stringstream中 std::string s = ss.str(); //得到stringstream中保存的字符串 std::cout << s << '\n'; //输出 std::string word; while(ss >> word)//从stringstream中读取每个单词 std::cout << word << '\n'; std::cout << std::endl; return 0; }