2011-08-29 39 views
4

我正在写一个简短的程序来对整数数组进行排序。我无法打开我的输入文件“prog1.d”。转让已要求创建的程序目录的符号链接,和我创建对象&可执行文件后,我们调用该程序如下...使用标准输入重定向输入

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

我知道我的冒泡排序的有效工作正常&,因为我已经使用了我自己的测试'txt'文件。

分配说:

你的程序从标准输入获取随机整数,并将它们放入一个数组,按升序排列数组中排序整数,然后在stdout上显示数组的内容。

如何使用'cin'读取文件,直到EOF &将整数添加到我的数组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',就像有人在键盘上输入整数一样。

任何帮助将不胜感激。

+3

你冒泡作品有效率的?这是一个矛盾。 –

+0

哈哈,不错。我的意思是它的工作。更好? – bluetickk

+1

@Benjamin Lindley:巫婆中罕见的情况是,一个良好实施的泡泡排序超过了所有其他常用的排序算法。 – Nobody

回答

5

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

3

因为你是管道的标准输入文件,你不必对argv的文件名[1],刚读标准输入作为用户使用cin打字在控制台上,例如:

cin.getline (...); 
+1

+1,直到你提到'gets()',这值得-1。 –

+0

你能举个例子吗?我基本上是问如何从整个文件中读取输入,就好像他们在控制台上输入一样 – bluetickk

+0

@Oli fixed,我误解了c不是C++ –

2

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

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; 
} 
+0

请不要鼓励使用'std :: ios :: eof'来测试输入结束。测试'>>'表达式的布尔值更简单也更可靠。 –

+0

请参阅http://ideone.com/79dyq或http://ideone.com/FH6xQ了解为什么'std :: ios :: eof'是邪恶的例子。 –

+0

已更正。我通常会尝试用最小的改变来修正样本,这就是为什么我从原理上离开那部分。 –

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)); 
相关问题