2017-10-24 18 views
0

txtファイルの総数ワードを測定しようとしています。このファイルはランダムで、長さ3〜10の10語の各行で構成され、codeによって生成されます。特定の行の単語は、単一のスペースで区切られています。今、私は、ファイル内の単語の合計数を測定する方法はこれです:私は上記のコードを複数回実行する場合ifstream(ワードカウント)の予期しない動作

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

「\ n」の文字も考慮しましたか? – alseether

+2

'numWords'をゼロで初期化してみませんか? – DAle

+0

それがあなたが使っているプログラム全体であれば、 'numWords'は0で初期化されないかもしれません。 –

答えて

2

あなたのコード

  1. あなたはあなたのプログラムのプラットフォーム依存になり、バイナリモードで開いているファイル、との複数の問題があります。行は、'\r','\n'または"\r\n"で区切ることができます。テキストモードで開くと、行は'\n'で区切られます。
  2. いただきましios::ateフラグでファイルを開くと、すぐにseekg(0)を呼び出すのポイント?それは動作しますが、bith ios::ateseekgを省略すると、書き込みと読み取りが同じ効果と少ないコードになります。
  3. 単語ではなく、空白文字('\r'を除く)を数えています。ダブルスペースを含め、'\n'文字が行末などにあります。
  4. 最も根本的な原因 - 初期化されていない変数numWords。これを使用すると、未定義の動作が呼び出されます。あなたのケースでは、ランダムな結果が最も可能性の高い効果です。