2012-11-23 170 views
4

可能重複:
Why doesn’t getchar() recognise return as EOF in windows console?末輸入函數getline的

我有一個簡單的問題......可以說,我想只要有東西可以讀從非標準輸入線,但我不知道它會有多少行。比如我做學校的工作和輸入

a 
ababa 
bb 
cc 
ba 
bb 
ca 
cb 

我不知道它會到底有多少行是,所以我試圖

string *line = new string[100]; 
    int counter = 0; 
    while(getline(cin,line[counter])) 
    { 
    counter++; 
    } 

但它不工作...感謝您的幫助。

+1

它是如何 「不工作」? – ybungalobill

+0

嗯,例如我輸入「aa」,輸入「bb」,輸入,現在我不輸入任何東西,只需按下輸入,但沒有發生任何事情。我需要輸入最後一個值後輸入結束讀取。 – user1751550

回答

0

您也可以使用此文件標記的結尾。它的用法就是這樣。

std::ifstream read ("file.txt") ; 

while(!read.eof()) 
{ 
    //do all the work 
} 

如果文件已達到,此函數返回true。所以它會一直持續到你遇到這種情況。

編輯:

作爲評價所提及,eof可能是危險的,並不能提供所需的結果的方法。所以沒有保證它會在任何情況下運行。 你可以看看這裏可能發生的情況。

Reading from text file until EOF repeats last line

+2

這是一個非常危險的建議,通常會導致可怕的代碼。以合理或正確的方式使用'eof()'幾乎是不可能的。 –

+0

絕對正確。由於OP有學校工作和輸入格式,我認爲它很可能運行良好。 –

+1

*這種可怕的想法教給無辜者甚至更糟 - 這就是爲什麼幾乎所有與C++ I/O有關的SO帖子都以相同的方式錯誤*,並且擁有「多年C++經驗」的人不會得到這東西正確的,要麼。我們所能做的最好的事情就是從來沒有提到'eof()'存在於除最高級程序員之外的任何人。 –

1

你可以像獲得的行數:

string *line = new string[SIZE]; 
    int lines = 0; 

    while(lines < SIZE && getline(cin, line[lines]) && line[lines].size() > 0) 
    { 
     cout << input_line << endl; 
     lines++; 
    } 

不要忘記檢查,如果你不小於尺寸是串線能夠處理增加更多的線,否則可以得到分段錯誤。

+0

我不是從檔案中讀取,而是從標準輸入中讀取。 – user1751550

+1

@KerrekSB你可以告訴你有什麼問題嗎?所以我可以糾正。 – dreamcrash

+0

沒關係,你現在修好了。 –

1

最簡單的行計數器我能想到的會是這樣的:

#include <string> 
#include <iostream> 

unsigned int count = 0; 

for (std::string line; std::getline(std::cin, line);) 
{ 
    ++count; 
} 

std::cout << "We read " << count << " lines.\n"; 

測試:

echo -e "Hello\nWorld\n" | ./prog 

如果你想打折空行,說if (!line.empty()) { ++count; }代替。

4

如果你想輸入結束在一個空行,那麼你必須測試它。例如。

string *line = new string[100]; 
int counter = 0; 
while (getline(cin, line[counter]) && line[counter].size() > 0) 
{ 
    counter++; 
} 

恭喜使用getline()正確BTW。不像你給出的一些答案。

+1

如果你的計數器大於100,這將導致seq faul。對? – dreamcrash

+0

@dreamcrash,是的。更好的代碼是使用'std :: vector '和'push_back()'向該向量添加一行。但我喜歡一次介紹一件新東西。 – john

+0

''!line [counter] .empty()''會比''line [counter] .size()> 0''快得多。 – hinafu

0

這應該工作:

int cont = 0; 
string s; 
while(cin >> s) { //while(getline(cin,s)) if needed 
    if(s.empty()) break; 
    ++cont; 
}