使用stdin重定向输入

时间:2011-08-29 15:33:09

标签: c++ sorting stdin

我正在编写一个简短的程序来对整数数组进行排序。我无法打开输入文件“prog1.d”。分配要求在程序目录中创建一个符号链接,并在创建对象&可执行文件,我们按如下方式调用程序......

prog1.exe < prog1.d &> prog1.out

我知道我的冒泡排序正常工作&amp;因为我使用了自己的测试'txt'文件。

作业说:

  

你的程序从stdin中获取随机整数并将它们放在一个数组中,按升序对数组中的整数进行排序,然后在stdout上显示数组的内容。

如何使用'cin'读取文件,直到EOF&amp;将整数添加到我的数组a []?

到目前为止,这是我的代码:

int main( int argc, char * argv[] )
{
    int a[SIZE];

    for ( int i=1; i<argc; i++)
    {
        ifstream inFile; // declare stream
        inFile.open( argv[i] ); // open file
        // if file fails to open...
        if( inFile.fail() )
        {
            cout << "The file has failed to open";
            exit(-1);
        }
        // read int's & place into array a[]
        for(int i=0; !inFile.eof(); i++)
        {
            inFile >> a[i];
        }
        inFile.close(); // close file
    }

    bubbleSort(a); // call sort routine
    printArr(a); // call print routine

    return 0;
}

我知道打开一个流是错误的方法,我只是用它来测试'txt'文件我用来确保我的排序工作。老师说我们应该将输入重定向到'cin',就像有人在键盘上输入整数一样。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

在命令行上使用重定向时,argv不包含重定向。相反,指定的文件只会成为您的stdin / cin。因此,您不需要(也不应该尝试)明确地打开它 - 只需从标准输入读取,就像在未重定向输入时从终端读取一样。

答案 1 :(得分:3)

由于你在stdin上管道文件,你在argv [1]上没有文件名,只需在用户在控制台输入时读取stdin,例如使用cin:< / p>

cin.getline (...);

答案 2 :(得分:2)

其他答案完全正确,但这里是重写的代码澄清:

int main( int argc, char * argv[] )
{
    int a[SIZE];
    int count = 0;

    // read int's & place into array a[]
    //ALWAYS check the boundries of arrays
    for(int i=0; i<SIZE; i++) 
    {
        std::cin >> a[i];
        if (std::cin)
            count = count + 1;
        else
            break;
    }

    bubbleSort(a, count); // call sort routine
    printArr(a, count); // call print routine

    return 0;
}

答案 3 :(得分:1)

正如大家所说,直接使用std::cin - 你不需要打开输入文件,你的shell已经为你完成了。

但是,请,请,请不要使用cin.eof()进行测试,看看是否已经达到了输入的最终结果。如果您的输入有缺陷,您的程序将挂起。即使您的输入没有缺陷,您的程序也可能(但不一定)会再次运行循环。

尝试使用此循环:

int a[SIZE];
int i = 0;
while( std::cin >> a[i]) {
  ++i;
}

或者,使用会自动增长的std::vector来增加健壮性:

std::vector<int> a;
int i;
while(std::cin >> i) {
  a.push_back(i);
}

或者,使用通用算法:

#include <iterator>
#include <algorithm>
...
std::vector<int> a;
std::copy(std::istream_iterator<int>(std::cin),
          std::istream_iterator<int>(),
          std::back_inserter(a));