文件流再探

来源:互联网 发布:sftp自定义端口号 编辑:程序博客网 时间:2024/05/18 16:16

来一小段代码:

#include<fstream>#include<iostream>#include<cstdlib>using namespace std;int main(){    ifstream in_stream;    ofstream out_stream;    in_stream.open("D:c++\infile.txt");//问题1    out_stream.open("outfile.txt");    int a, b;    if(in_stream.fail()){              //问题2        cout << "failed" << endl;        exit(1);    }    in_stream >> a >> b;    out_stream << "a + b = " << (a+b) << endl;    in_stream.close();    out_stream.close();    return 0;}

现在来看第一个小问题:

in_stream.open(“D:c++\infile.txt”);//问题1
1
调用成员函数open参数文件名的规范,我们知道,一个完整的文件名是包含这个文件的路径及其文件名的,现在我把完整的文件名作为参数,为什么会有错误?呵,仔细想想一个细节,\字符需要转义(\\)。
所以这里应当改回:

in_stream.open(“D:c++\\infile.txt”);//问题1正解
1
第二个重要的问题就是检查流操作的正确性:

if(in_stream.fail()){              //问题2        cout << "failed" << endl;        exit(1);    }

我们常常需要判断一个流对象是否成功连接到一个文件,因此,在一个流对象调用open之后总应该调用fail来测试,这也是一个必要的习惯。
成员函数fail不接受任何参数,返回一个bool类型。它的原型是bool ifstream::fail();和 bool ofstream::fail();。这样,能清楚地知道文件的连接是否到位。
接下来就说另一个重要的成员函数eof。用它来判断文件尾,它同样不接受任何参数,返回bool值。例如以下语句:

if(!in_stream.eof()){                  cout << "Not done" << endl;}else   cout << "file done" << endl;

至于为甚么需要预判文件尾,一个原因是在程序运行过程中,流对象从不返回来去读取已经读取过的内容,即像时间一样不去倒流。
最后补充一个关于输出文件的小技巧,你若想要把内容写入到一个已经存在的文件中,而且又不想覆写这个文件,只想把内容追加到文件尾,那么你可以这样调用open:

out_stream.open(“outfile.txt”,ios::app); //两个参数
1
这样你这次输出的内容会追加到outfile.txt(已经存在)的文件尾了。

END

0 0
原创粉丝点击