C ++ IO文件流:使用运算符<<来自一个文件到另一个文件和rdbuf()

时间:2011-05-24 17:13:13

标签: c++ stl fstream ifstream

我有一个问题,即使用运算符<<在C ++(fstream)中将数据从一个文件复制到另一个文件。这是一个适合我的代码段:

    #include <fstream>
    #include <string>

    void writeTo(string &fname, ofstream &out){
        ifstream in;
        in.open(fname.c_str(),fstream::binary);
        if(in.good()){
            out<<in.rdbuf();
            in.close();
        }else{
            //error
        }
    }

我想确定在写完之后,已经到达了流in中输入文件的结尾。但是,如果我测试in.eof(),它是false,尽管检查输入和输出文件确认整个内容已被正确复制。关于如何检查in.eof()的任何想法?

3 个答案:

答案 0 :(得分:1)

尝试读取字符时设置EOF位,但没有可用(即您已经消耗了字符串中的所有内容)。显然std::ostream::operator<<()不会尝试读取字符串的结尾,所以从未设置该位。

您应该可以通过尝试访问下一个字符来解决此问题:在检查in.peek()之前添加in.eof()。我已经测试了这个修复程序并且它可以正常工作。

答案 1 :(得分:1)

在输入文件中没有设置状态位的原因是因为 您正在阅读streambuf,而不是istream;实际上 阅读发生在ostream::operator<<,而没有 访问istream

但是,我不确定这是否重要。输入将被读取,直到 streambuf::sgetc返回EOF。哪会导致eofbit 如果您正在阅读istream,请在istream中设置。该 如果你正在阅读,那么唯一可能阻止这种情况的事情 istreamstreambuf::sgetc引发异常,这会导致异常 在badbit中设置istream;没有提供其他机制 输入streambuf以报告读取错误。所以将out << in.rdbuf()包装在try ... catch块中,并希望实现 实际上确实检查硬件错误。 (我最近没查过, 但很多早期实现完全忽略了读取错误,处理 它们作为文件的正常结尾。)

当然,既然你真的在读字节(尽管有<<,我 看不出如何调用这种格式化的输入),你没有必要 考虑第三种可能的错误来源,即格式错误(例如 输入int时的“abc”。

答案 2 :(得分:0)

尝试in.rdbuf()->sgetc() == EOF

参考:http://www.cplusplus.com/reference/iostream/streambuf/sgetc/