c++ 我应该处理cin / stdin的多个示例吗?

lxkprmvk  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(100)

下面是一个小程序在C++这是应该作为猫linux binutil:它获取命令行参数中详细说明的一个或多个输入(可能通过"-"指定stdin)并将它们复制到标准输出。不幸的是,它显示了一个我无法理解的根本原因的意外行为...
根据以下命令

./ccat - test.text

我直接按了CTRL-D键,没有传递任何字符,我希望程序无论如何都会显示test.txt的内容,但是程序退出时没有向标准输出流传递任何字符。
有什么想法我应该如何纠正我下面的代码在这种情况下有正确的行为?我应该处理标准流的多个示例(cin,cout ...)?如果是这样,你知道如何在C++中实现这一点吗?
先谢谢你。

/**** ccat.cpp ****/

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main(int argc, char **argv) {
    if (argc <= 1) {
        cout << cin.rdbuf();
    } else {
        vector<string> inputs;
        for (int i=1; i<argc; ++i) inputs.push_back(argv[i]);

        for (auto &in: inputs) {
            if (in == "-" || in == "--") {
                cout << cin.rdbuf();
            }
            else {
                ifstream *fd = new ifstream(in);
                if (!fd->is_open()) cerr << "Cannot open file \'" << in << "\'\n";
                else cout << fd->rdbuf();
                delete fd;
            }
        }
    }

    return 0;
}

我按顺序尝试了以下命令:

$ ./ccat > test.txt
Let's try this text.
I would expect a correct behaviour.
$ ./ccat - test.txt # I hit CTRL-D directly without passing any character first
$ ./ccat - test.txt
But when I add some characters before hitting CTRL-D... This works fine.
But when I add some characters before hitting CTRL-D... This works fine.
Let's try this text.
I would expect a correct behaviour.

如示例所示,我希望在两种情况(最后两个shell提示符)中的任何一种情况下,test.txt都会显示在标准输出上,但只有当我首先通过标准输入注入字符时才会出现这种情况,直接按CTRL-D键会使程序过早退出。

svmlkihl

svmlkihl1#

这是超载10here

basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb );

上面写着
如果未插入字符,则执行setstate(failbit)
换句话说,cout现在处于错误状态,不会输出任何内容。

cout.clear();

首先在else分支中,或者最后在if分支中,应该执行此操作。
请注意,将文件尾发送到标准输入通常不是您可以从中恢复或“重新启动”的操作,因此您可能只能使用一个标准输入“部分”。

相关问题