C++ IO 文件流:使用 operator<< 和 rdbuf() 从一个文件写入另一个文件



我有一个关于使用运算符<<将数据从一个文件复制到另一个文件的问题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()的任何想法?

EOF 位是在尝试读取字符时设置的,但没有可用的(即您已经使用了字符串中的所有内容(。显然std::ostream::operator<<()不会尝试读取字符串的末尾,因此永远不会设置位。

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

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

但是,我不确定这是否重要。 输入将被读取,直到 streambuf::sgetc返回EOF . 这将导致eofbit如果您正在通读istream,则设置在istream中。 这如果您正在阅读 istream是如果streambuf::sgetc抛出异常,这将导致 badbit设置为istream;没有提供其他机制以报告读取错误的输入streambuf。 所以把你的out << in.rdbuf()包在一个try ... catch块中,并希望实现实际上确实检查了硬件错误。 (我最近没有检查,但是许多早期的实现完全忽略了读取错误,将它们作为文件的正常结尾。

当然,由于您实际上是在读取字节(尽管<<,我不明白如何调用此格式化输入(,您不必考虑第三个可能的错误来源,即格式错误(例如输入 int 时的"abc"(。

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

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

相关内容

最新更新