将 ifstream 转储到 cout 时如何处理空文件?

How do I handle empty files when dumping ifstream to cout?

提问人:samw 提问时间:2/9/2023 更新时间:2/9/2023 访问量:71

问:

我正在尝试将文件的内容转储到 .cout

#include <iostream>
#include <fstream>

int main(int argc, char** argv)
{
    if (argc > 1) {
        std::ifstream fin(argv[1]);
        if (fin) {
            std::cout << "---file contents---\n";
            std::cout << fin.rdbuf();
            std::cout << "---end contents---\n";
        } else {
            std::cout << "The file does not exist\n";
        }
    }
    else {
        std::cout << "Usage: " << argv[0] << " FILE\n";
    }
    if (std::cout.good()) {
        return 0;
    }
    else if (std::cout.fail()) {
        return 1;
    }
    else {
        return 2;
    }
}

当输入文件为空时,此代码无法按预期工作。它打印初始的“---file contents---”,但从不打印尾随的“---end contents---”。调试后,我发现应用程序没有崩溃,而是处于错误状态(返回代码为 1)。std::cout

如何在不进入错误状态的情况下打印空文件的内容?cout

C++ Fstream IOstream IFStray

评论

1赞 Some programmer dude 2/9/2023
在不相关的说明中,有许多可能的原因无法打开文件,而不仅仅是它不存在。:)
0赞 samw 2/9/2023
好点子。我想我的错误消息在这种情况下是错误的。但是,如果成功打开空文件,我希望什么都不打印,然后愉快地继续前进cout << fin.rdbuf()
0赞 Some programmer dude 2/9/2023
关于您的问题,我的猜测是,因为文件是空的,所以没有什么可以缓冲的,也没有创建缓冲区。这意味着返回一个 null 指针,并在输出流上设置。检查什么先返回。rdbuf()badbitrdbuf()
1赞 samw 2/9/2023
我也有类似的预感,但事实并非如此。检查打印前的结果发现指针不为空。rdbuf()

答:

1赞 Some programmer dude 2/9/2023 #1

运算符<<参考(列表中的重载编号 10)解释了这一切:

如果未插入任何字符,则执行 .setstate(failbit)

由于输入文件为空,因此没有要插入到输出流中的字符。并且设置好了。failbit

您需要添加一个特定的检查,用于failbit

std::cout << fin.rdbuf();

以查看输入文件是否为空。

评论

0赞 samw 2/9/2023
是的,情况似乎是这样。感谢您的帮助!