2015-09-09 87 views
2

下面的代碼應該算作:從文本文件中讀取的行,字符和單詞。從文件輸入計算行數?

輸入文本文件:

This is a line. 

This is another one. 

所需的輸出是:

Words: 8 

Chars: 36 

Lines: 2 

然而,字數統計出來爲0,如果我改變那麼它的線條和文字出來爲0,字數是正確的。我得到這個:

Words: 0 

Chars: 36 

Lines: 2 

這是我的代碼:

#include<iostream> 
#include<fstream> 
#include<string> 

using namespace std; 


int main() 
{ 
    ifstream inFile; 
    string fileName; 


    cout << "Please enter the file name " << endl; 
    getline(cin,fileName); 
    inFile.open(fileName.c_str()); 

    string line; 
    string chars; 
    int number_of_lines = 0; 
    int number_of_chars = 0; 

while(getline(inFile, line)) 
    { 
     number_of_lines++; 
     number_of_chars += line.length(); 
    } 

    string words; 
    int number_of_words = 0; 

while (inFile >> words) 
    { 
     number_of_words++; 
    } 

    cout << "Words: " << number_of_words <<"" << endl; 
    cout << "Chars: " << number_of_chars <<"" << endl; 
    cout << "Lines: " << number_of_lines <<"" << endl; 

    return 0; 
} 

任何指導,將不勝感激。

+4

'while(getline(inFile,line))'吃了整個文件。在'while(inFile >> words)之前倒帶或關閉並重新打開' – user4581301

+2

您需要1.關閉並重新打開文件2.使用'stringstream'查找每行中有多少個單詞。 – crashmstr

+3

從長遠來看,使用'stringstream'來獲取每行文字可能更有用。 – crashmstr

回答

2

而且因爲評論通常都是通過回答求職者未讀...

while(getline(inFile, line)) 

讀取整個文件。當它這樣做​​的讀取位置設置爲文件,使字計數循環

while (inFile >> words) 

開始讀取在文件的結尾,發現沒有結束。爲使其正確執行,對代碼進行的最小更改是在計算單詞之前使用seekg後退文件。

inFile.seekg (0, inFile.beg); 
while (inFile >> words) 

位置讀取位置到文件偏移0相對於所述文件(由inFile.beg指定)的開始,然後通過讀取文件來算的話。

雖然這個工作,它需要兩個完整的讀取文件,這可能是相當緩慢的。 crashmstr在評論中提出了一個更好的選項,並通過simplicis veritatis實現,作爲另一個答案,需要讀取文件以獲取和計算行數,然後通過RAM中的每一行迭代來計算單詞數。

它具有相同數量的總迭代次數,所有內容都必須逐一計數,但從內存中的緩衝區讀取比從磁盤讀取更好,因爲速度,數量級,訪問和響應時間要快得多。

+0

他們只是太多的閱讀,對不起 – Ziezi

+2

@simplicisveritatis同意。 – user4581301

1

這裏是一個可能的實現(未測試)爲基準,使用方法:

int main(){ 

// print prompt message and read input 
cout << "Please enter the file name " << endl; 
string fileName; 
getline(cin,fileName); 

// create an input stream and attach it to the file to read 
ifstream inFile; 
inFile.open(fileName.c_str()); 

// define counters 
string line; 
string chars; 
int number_of_lines = 0; 
int number_of_chars = 0; 
vector<string> all_words; 

do{ 
    getline(inFile, line); 
    // count lines 
    number_of_lines++; 
    // count words 
    // separates the line into individual words, uses white space as separator 
    stringstream ss(line); 
    string word; 
    while(ss >> word){ 
     all_words.push_back(word); 
    } 
}while(!inFile.eof()) 
// count chars 
// length of each word 
for (int i = 0; i < all_words.size(); ++i){ 
    number_of_chars += all_words[i].length(); 
} 

// print result 
cout << "Words: " << all_words.size() <<"" << endl; 
cout << "Chars: " << number_of_chars <<"" << endl; 
cout << "Lines: " << number_of_lines <<"" << endl; 

return 0; 
}