1

我正在为一个读取空格分隔文件的 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 对象并将其定向到键盘或其他东西?我不知道在这里做什么

4

1 回答 1

0

使用向量:

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);
    }
}
于 2013-10-25T12:10:36.783 回答