- ベストアンサー
C++のfgets関数におけるバッファ残留文字列の無視方法
- C++のfgets関数を使用してファイルから文字列を読み込む際、指定した長さを超えた文字列がある場合、バッファに残ってしまい次のfgets呼び出しで読み込まれてしまうことがある。
- バッファに残った文字列を無視して2行目を読み込む方法としては、fgetsの後に余分な文字列を読み込んでおくことで解決できる。
- 具体的には、1行目をfgetsで読み込んだ後、fgetsを一度呼び出して結果を無視し、2行目を読み込むようにする。こうすることで、バッファに残った余分な文字列を読み飛ばすことができる。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
たぶん、質問にストレートに答えれば「fflush()を使う」になるのだと思います。 もしかしたら、キー入力に限定すればそれでうまくいくかも知れませんが、あまりスマートな方法とは思えません。 結果的に何をしたいのかが不明なので、答えが難しいですが、通常は fgets()で必要量以上のエリア(strの代わりになるもの)に1行まるまる読み込んでから、必要分だけをstrなどに格納するのが入力媒体に依存しない確実な方法となります。 あるいは、strの先頭10文字だけと言うのならば、strに1行読み込んだ後に、 printf("%10.10s\n",str); と言う手もあると思います。 これはstrの内容をどうしたいのかで、正解は違ってきますが、どちらにしてもfgets()では1行読み込むようにしましょう。 数バイトのメモリーをケチっても、誰も得はしませんので、どんどん使いましょう。
その他の回答 (4)
- anicicle
- ベストアンサー率36% (129/356)
No.2です。 No.3さん、そこ、こだわる?重要? 質問にストレートに答えれば fflush(fp); となるのでしょうが、No.3さんの言われているように未定義でしたね。 済みません。 でも、私も「もしかしたら」と書いているし、推奨しているわけではないですし、揚げ足取りと言われても仕方がないような。 当然、私の回答のそれ以降に関しての指摘がないと言うことは、それは正しいと言うことなのですよね。 一部が違うから、全部が違うという意味ではないですよね。
- asuncion
- ベストアンサー率33% (2127/6289)
>「fflush()を使う」 引数は何ですか? stdoutあたりだったら何も問題はありませんが、 例えば fflush(stdin); と書くのは動作未定義です。 fflush()は出力バッファをクリアするために使うのでありまして、 入力バッファをカラにするために使う「のではありません」。
- kmee
- ベストアンサー率55% (1857/3366)
> printf("str (%2d)= %s\n", strlen(str), str); > すると、実施結果は ...とはなりませんよね。 str(XX)=の部分が表示されてませんから。 それはともかく 1行最後まで読み込めたら、改行文字がstrに含まれます。 なので ・str[strlen(str)-1] == '\n' かどうか調べる → true: fgetc(fp)などで '\n'になるまで読み飛ばす というのがやりかたの一つです。 改行無しにEOFになる場合等のエラー処理は忘れずに。
お礼
ご回答ありがとうございました。 こちらとしても、当初はfflushを使用して実施したのですが上手くいかず、他に代用できる標準関数があるかもしれないと思い、質問させていただいた次第でした。 しかし、ghyytucvukさんの助言と、他の方々の助言を拝見し、やはり、力業でファイルポインタを移動するしかないのだという結論に至りました。 僭越ながら、最も分かり易い文章として参考にさせていただきました、ghyytucvukさんの助言をベストアンサーとさせていただきます。 ご助力ありがとうございました^^