- ベストアンサー
データを読み込み
データを読み込んで、表示するというものですが、 実行するとなぜか各行を読み込んだあとに 改行が入ってしまいます。 わかる方は何かアドバイスをお願いします。 ===================================== #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
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
fgets は改行文字をそのまま文字列に組み込みその後 NULL終端します。 gets を使うと改行をNULLに置き換えます。 最大文字数は、引数指定数からNULL終端分の1引いた 文字数が読み込まれるので、バッファサイズを超える ことは無いと思われます。まあ、怪しいときは大きめに バッファを取っといた方が一応安心。 test.dat は改行区切りのデータだと思われますが そのコードのループだと 1周目・・・1行目を最大数の80文字読み込み+NULL 2週目・・・1行目の残りの改行を読み込み+NULL 3周目・・・2行目を最大数の80文字読み込み+NULL 4週目・・・2行目の残りの改行を読み込み+NULL ~~~ で改行入りで続いていく 最大数と改行とでは最大数の条件を先に判定していきます。 ということで (参考URLはただのヘルプです)
その他の回答 (1)
- leaz024
- ベストアンサー率75% (398/526)
fgets という関数は、第2引数で指定したサイズ分の文字を読み込み、さらに\0を最後に付加します。 このため string という変数には、81文字+\0 という82文字を入れてしまうのです。(つまり81文字目に、データファイル内に存在する改行データを読み込んでしまう。) もちろん、string は81バイトしか確保されていないので、操作してはいけない領域(82バイト目)に値を書き込んでしまうのは、大変よろしくない行為です。 ですので、fgets の第2引数を「80」と指定しましょう。 これで解決するはずです。
補足
leaz024さん回答ありがとうございます。 fgets の第2引数を「80」としましたが、 うまくうごきませんでした。 第2引数を81としたのは 80文字で、81文字目に\0としたつもりでした。
お礼
cheさん回答ありがとうございます。 fgetsの動きが理解できました。 これを参考にうまく作りたいと思います。