掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
fgets後のmap処理について (ID:57286)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 指摘等ありましたら、 致命的な点: 1. ファイルからの読み込み終了の判定 while( !feof(fp) ){ fgets(buffer,sizeof(buffer),fp); ... } feofはファイル終端に達しているかどうかを「終端指示子」と言われるもの のON/OFFによって判定します。 ところが、fgetsで最後の行を読み込んだときにはまだ終端指示子はOFFで、 次にfgetsなどで読み込もうとしたとき(読み込みに失敗したとき)に終端指 示子がONとなり、はじめてfeofでファイル終端に達したことが判定できます。 このため、上のコードだと、最後の行の読み込みの後、もう一回fgets以下が 実行されてしまいます。 終端に達したファイルに対してfgetsを実行するとbufferにはNULLが返ります から、それ以降の処理がおかしくなります。 この場合、ファイル終端の判断はfgetsの戻り値を使うのが妥当と思います。 while( fgets( buffer, sizeof(buffer), fp ) != NULL ){ ... } 2. printfの引数 printf( "%s", p->second ); mapdataの第2要素の型はstd::stringなので、それをこの書式で出力するこ とはできません。 コンパイルできてしまうかも知れませんが、実行結果はどうなることやら... std::stringクラスには、Cスタイル文字列(const char*)を返すメンバ関数 "c_str"がありますので、それを使いましょう printf( "%s", p->second.c_str() ); あと、致命的ではありませんが、 token = strtok(NULL,"\0"); fgets関数は行末の改行文字'\n'もバッファに格納しますから、これだと、改 行文字も含めてmapdataの第2要素に格納されます。 そういう仕様であれば良いのですが、改行文字は格納したくないということ であれば、 token = strtok( NULL, "\n" ); とするのが良いと思います。 以上、ざっと眺めて気がついた点を指摘させていただきました。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.