【问题标题】:reading piped stdin and user input读取管道标准输入和用户输入
【发布时间】:2025-06-13 03:50:01
【问题描述】:

我正在为一个读取空格分隔文件的 c++ 数据结构类编写一个程序,我编写了一个小函数,以便我可以通过管道输入不同的文件并使用它们,但我也想接受用户输入使用 cin ,似乎缓冲区只是循环。我在这里有点超出我的深度,但这是我的输入功能。我正在通过 $ cat filename | 运行程序./编译执行。我希望有人可能知道为什么在其他地方使用 cin 不等待用户输入并可能帮助解决问题?

    void catchPipe(int dataArray[][9]);
    int main(){
        int inArray[9][9];
        int column;
        catchPipe(inArray);

        cout << "Which column would you like to check?";
        cin >> column;  // This input is skipped totally.
        functionChecksIfInCol(column);  //Function  called with garbage value
        cout << "end program" << endl;
        return 0;
    }

    void catchPipe(int dataArray[][9]){
        int i;
        int n=0;
        int pos=0;
        string mystring;
        while(cin){
            getline(cin, mystring);
            if( n < 9 ){
                for(i = 0; i < mystring.length(); i++){
                    if( (int)mystring[i] != 32 ){
                        dataArray[n][pos] = mystring[i] - '0';
                        pos++;
                    }   
                }pos =0; 
            ++n;
            }   
        }   
    }// end catchPipe()
     //Sample File input:     
    0 8 0 1 7 0 0 0 3   
    0 2 0 0 0 0 0 0 9   
    0 9 0 0 3 0 5 4 8   
    0 0 4 0 9 0 0 0 0   
    0 0 0 7 0 3 0 0 0   
    0 0 0 0 1 0 4 0 0   
    6 1 9 0 8 0 0 5 0   
    7 0 0 0 0 0 0 8 0   
    2 0 0 0 6 4 0 1 0  

谢谢!

程序填写了我的 inArray,但它跳过了对 cin 的下一次调用。我假设这是因为标准输入已从键盘重定向到来自 Linux 的管道?也许我可以声明另一个 istream 对象并将其定向到键盘或其他东西?我不知道在这里做什么

【问题讨论】:

    标签: c++ file-io stdin


    【解决方案1】:

    使用向量:

    void cachePipe(std::vector<std::vector<int>> data)
    {
        std::string line;
        while (std::getline(std::cin, line))
        {
            std::istringstream iss(line);
            std::vector<int> fill((std::istream_iterator<int>(line)),
                                std::istream_iterator<int>());
            data.push_back(fill);
        }
    }
    

    【讨论】:

    • 这将如何让我在程序中重用 cin 进行键盘输入?我遇到的问题是任何以后的 cin 调用都被跳过,而不是要求用户输入。
    • @Matt 你能告诉我cin 给你的这种行为的例子吗?可能只是其中一个流状态标志处于打开状态。尝试在任何后续输入操作之前执行cin.clear()
    • 我确实尝试了 cin.clear()。我真的不能举个例子,但它基本上跳过了我的其他 cin 电话。我将在我的帖子中添加更多代码,让您了解该程序的功能。我基本上是用来自 linux 管道的字符串输入填充一个二维 int 数组。
    • 我有同样的问题,输入缓冲区被 cin.ignore(1000,'\n') 和 cin 标志状态重置 (cin.clear()) 刷新。该程序以交互方式工作得很好,但是如果我尝试通过管道将输入传递给它,它只会在有一些讨厌的管道时进入无限循环,就好像输入缓冲区上的所有这些补救操作都被忽略了一样。
    • @EsmuIgors 当您通过管道向程序输入输入时,它会作为程序的参数接收。程序参数可以通过int main() 函数的参数访问。 geeksforgeeks.org/command-line-arguments-in-c-cpp