• ベストアンサー

行数を求めたい

テキストファイルには64この整数がスペースを一つずつあけて並んでいます。それが2行あります。 このテキストの行を数えたいのですが、下のプログラムでは6行と帰ってきます。これはなぜなのでしょうか?よろしくお願いします。また、行数のいい求め方がありましたら教えてください。 char s[64]; int gyouretu=0; FILE* fin=fopen(" "."r"); while( fgets(s,63,fin)!=NULL ){ gyousu++; } 実行結果 gyousu=6

質問者が選んだベストアンサー

  • ベストアンサー
  • harlan
  • ベストアンサー率77% (234/303)
回答No.2

fgets( )の使い方を間違えているからです。 この関数は、改行文字の読み込み、ファイルの終りの検出以外にも、最大文字数-1を読み込んだ時にも 文字列の最後にNULL文字を追加して戻ってきます。今回のソースでは、63-1文字になります。 (配列のサイズ-1を引数として渡す必要はありません。) 64個の整数が空白で区切られている場合、全てが一桁の整数でも改行文字を含めると最低でも 1行は128文字ありますので、63では改行文字に出会う前に戻ってきてしまいます。 配列のサイズと最大文字数を十分に大きく取れば、このソースでも正しく動作しますが、予想外の ファイルを扱った場合に誤動作する等、扱えるファイルが制限された、応用の利かないプログラムに なりますので、あまりいい方法とは言えません。 No.1の方のような方法を取るか、s[ ]に格納された文字の中から改行文字をカウントする方法を 取って下さい。

その他の回答 (1)

回答No.1

6行になるのは1行の長さが63*3バイトぐらいあるからでは? で、行を数えたいだけなら '\n' の出現回数をカウントするだけでいいと思います。(ファイルの最後の行の終わりに '\n' がない場合は1行足りなくなりますが) 例 FILE *fp; int c, gyousu = 0; if ((fp = fopen("ファイル名", "r")) != NULL) {  while ((c = getc(fp)) != EOF)   if (c == '\n')    gyousu++;  fclose(fp); }

関連するQ&A