簡體   English   中英

ifstream的異常行為(字計數)

[英]Unexpected behavior of ifstream (word counting)

我正在嘗試測量txt文件中的單詞總數。 該文件是隨機的,由每行10個字組成,每行長度3到10,由該代碼生成。 特定行中的單詞由單個空格分隔。 現在,我測量文件中單詞總數的方法是:

ifstream inputFile("myfile.txt", ios::in | ios::binary | ios::ate );

//Count number of total words in input file
long unsigned int numWords;
inputFile.seekg(0);
char c;
while (inputFile.get(c)){
    if (isspace(c) && c != '\r') numWords++;
}

//Test
printf("\nSampled file has %lu words\n", numWords);

如果我多次運行以上代碼,則其中一半將得到正確的結果,而另一半將得到一個隨機數。 我知道有更優雅的方法可以做到

string word;
long unsigned int ctr = 0;
while (inputFile >> word) ctr++;

(或其他),但我想知道第一個選擇為什么失敗。

您的代碼有多個問題

  1. 您以二進制模式打開文件,這使您的程序依賴於平台。 行可以用'\\r''\\n'"\\r\\n"分隔。 如果以文本模式打開,則保證行用'\\n'分隔。
  2. ios::ate標志打開文件並立即調用seekg(0)什么意義? 它可以工作,但是省略位ios::ateseekg具有相同的效果,並且減少了編寫和讀取的代碼。
  3. 您要計算空格字符(不包括'\\r' ),而不是單詞。 包括雙精度空格,行尾的'\\n'字符和類似字符。
  4. 而最可能的根本原因是未初始化的變量numWords 使用它會調用未定義的行為。 在您的情況下,隨機結果是最可能的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM