文件流再探

来一小段代码:


#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值