• ベストアンサー

データを読み込み

データを読み込んで、表示するというものですが、 実行するとなぜか各行を読み込んだあとに 改行が入ってしまいます。 わかる方は何かアドバイスをお願いします。 ===================================== #include <stdio.h> #include <stdlib.h> #include <string.h> char filename[15], string[81]; main(){  FILE *fp = 0;  printf("input file:");  scanf("%s", filename);  if( (fp=fopen( filename, "r")) == NULL ){   printf("%s:don't open file", filename );   exit( 1 );  }  while(fgets( string,81, fp ) != NULL ){  printf("%s", string);  }  fclose( fp );  return 0; } =========================== test.dat : 80byte/rec =========================== 01234567890123456789012345678901234567890123456789012345678901234567890123456789 00000000000000000000000000000000000000000000000000000000000000000000000000000000 11111111111111111111111111111111111111111111111111111111111111111111111111111111

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

  • ベストアンサー
noname#2009
noname#2009
回答No.2

fgets は改行文字をそのまま文字列に組み込みその後 NULL終端します。 gets を使うと改行をNULLに置き換えます。 最大文字数は、引数指定数からNULL終端分の1引いた 文字数が読み込まれるので、バッファサイズを超える ことは無いと思われます。まあ、怪しいときは大きめに バッファを取っといた方が一応安心。 test.dat は改行区切りのデータだと思われますが そのコードのループだと 1周目・・・1行目を最大数の80文字読み込み+NULL 2週目・・・1行目の残りの改行を読み込み+NULL 3周目・・・2行目を最大数の80文字読み込み+NULL 4週目・・・2行目の残りの改行を読み込み+NULL   ~~~ で改行入りで続いていく 最大数と改行とでは最大数の条件を先に判定していきます。 ということで (参考URLはただのヘルプです)

参考URL:
http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_fgets.2c_.fgetws.htm
hgdream
質問者

お礼

cheさん回答ありがとうございます。 fgetsの動きが理解できました。 これを参考にうまく作りたいと思います。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

fgets という関数は、第2引数で指定したサイズ分の文字を読み込み、さらに\0を最後に付加します。 このため string という変数には、81文字+\0 という82文字を入れてしまうのです。(つまり81文字目に、データファイル内に存在する改行データを読み込んでしまう。) もちろん、string は81バイトしか確保されていないので、操作してはいけない領域(82バイト目)に値を書き込んでしまうのは、大変よろしくない行為です。 ですので、fgets の第2引数を「80」と指定しましょう。 これで解決するはずです。

hgdream
質問者

補足

leaz024さん回答ありがとうございます。 fgets の第2引数を「80」としましたが、 うまくうごきませんでした。 第2引数を81としたのは 80文字で、81文字目に\0としたつもりでした。

関連するQ&A