2011-08-29 92 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)); 
相關問題