IO分三大类:流、文件以及字符串,它们分别对应iostream、 fstream、 sstr-eam三个头文件。通过继承机制,后两者的很多函数的使用方法都可以直接套用iostream的,比如:ifstream和istringstream都继承自istream,我们就可以像使用cin一样使用ifstream和istringsteam对象。
-
IO对象无拷贝或赋值
IO对象无法被拷贝,所以我们也不能将返回类型和形参设为流形式。另外,由于IO对象的状态在读写时会改变状态,所以我们也不能对其指针形参用const限定。
-
条件状态
IO类定义了条件状态供我们访问和检查。其中,badbit置位表示系统错误,无法恢复;failbit置位表示有错误发生,可以恢复;eofbit置位表示流到达了文件结束;而goodbit则用来指出流未处于错误状态,此值保证为0。
另外,不要直接访问这些参数,用IO类提供的eof()、fail()、bad()和good()函数来检查。
通常我们都用rdstate()来得到流的当前状态,而用clear()将所有条件状态复位。至于clear(flags)和setstate(flasgs)则分别表示恢复flags的条件状态和将flags条件状态位置位。
-
缓冲
我们只需要记住三点:
-
cout<<"hi"<<endl表示输出“hi”和一个换行(line),然后刷新缓冲区
-
cout<<"hi"<<flush表示输出“hi”,然后刷新缓冲区
-
cout<<"hi"<<ends表示输出“hi”和一个空格(space),然后刷新缓冲区
-
文件输入输出
动手实践了一个例子:
1 #include <fstream> 2 #include <iostream> 3 #include <string> 4 5 using namespace std; 6 7 /*一个简单的文件输入输出程序:将当前文件夹中的 8 hint.txt中的内容传到tnih.txt中。*/ 9 int 10 main() 11 { 12 string s; 13 string m = ""; 14 ifstream inputF("hint.txt"); 15 ofstream outputF("tnih.txt"); 16 17 while (inputF >> s) 18 m += s + " "; 19 outputF << m << endl; 20 inputF.close(); 21 outputF.close(); 22 23 }
其中,我碰到的问题如下:
-
std::ifstream>>std::string等流与string传递的使用得不到支持
-
源文件只能输出一单词到目标文件
上网后发现,关于流文件和string对象传值的操作定义在string头文件里,不过联想到sstream头文件,这样做也便无可厚非,所以为了方便,我加上了string头文件。
然后关于输出内容不完整的问题,想了下发现原来在以字符串为媒介传值时源文件会将内容按空格等符号分割成多个字符串,所以我用一个while循环将源文件全部传到m里面,并且补完了因分割而丢掉的空格。
-
string流
哎,这个真的没什么好说的了,正如我在1里面提到的,因为它们继承机制的原因,使用方法都大同小异。