アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
早速質問させていただきます。

言語はC++です。

ファイルに、以下の文字列があったとします。
============================
123456789012
12345678901
1234567890
123456789
============================
この時、

fgets( str, 10, fp);
printf("str (%2d)= %s\n", strlen(str), str);

を、EOFになるまで繰り返します。

すると、実施結果は
============================
123456789
012

123456789
01

123456789
0

123456789
============================
となります。

これは、fgetsで10というレングスを指定しているために、1行読み込んで、10文字以降の文字列はバッファに残ってしまっているため、
2度目のfgetsで、10文字以降の文字列が読み込まれ、書き出されているものと思われます。

この時、fgetsで1行読み込んだ後、バッファに残った文字列を無視し、2度目のfgetsで、2行目を読み込むにはどうしたらよいでしょうか?

有識者の方、ご教授ください。よろしくお願いします。

A 回答 (5件)

たぶん、質問にストレートに答えれば「fflush()を使う」になるのだと思います。


もしかしたら、キー入力に限定すればそれでうまくいくかも知れませんが、あまりスマートな方法とは思えません。

結果的に何をしたいのかが不明なので、答えが難しいですが、通常は fgets()で必要量以上のエリア(strの代わりになるもの)に1行まるまる読み込んでから、必要分だけをstrなどに格納するのが入力媒体に依存しない確実な方法となります。

あるいは、strの先頭10文字だけと言うのならば、strに1行読み込んだ後に、
printf("%10.10s\n",str);
と言う手もあると思います。

これはstrの内容をどうしたいのかで、正解は違ってきますが、どちらにしてもfgets()では1行読み込むようにしましょう。

数バイトのメモリーをケチっても、誰も得はしませんので、どんどん使いましょう。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/fflush.html
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
こちらとしても、当初はfflushを使用して実施したのですが上手くいかず、他に代用できる標準関数があるかもしれないと思い、質問させていただいた次第でした。
しかし、ghyytucvukさんの助言と、他の方々の助言を拝見し、やはり、力業でファイルポインタを移動するしかないのだという結論に至りました。
僭越ながら、最も分かり易い文章として参考にさせていただきました、ghyytucvukさんの助言をベストアンサーとさせていただきます。
ご助力ありがとうございました^^

お礼日時:2011/03/04 01:02

これが参考になるかもね。


http://detail.chiebukuro.yahoo.co.jp/qa/question …
    • good
    • 0

No.2です。


No.3さん、そこ、こだわる?重要?

質問にストレートに答えれば
fflush(fp);
となるのでしょうが、No.3さんの言われているように未定義でしたね。
済みません。
でも、私も「もしかしたら」と書いているし、推奨しているわけではないですし、揚げ足取りと言われても仕方がないような。

当然、私の回答のそれ以降に関しての指摘がないと言うことは、それは正しいと言うことなのですよね。
一部が違うから、全部が違うという意味ではないですよね。
    • good
    • 1

>「fflush()を使う」



引数は何ですか?
stdoutあたりだったら何も問題はありませんが、
例えば
fflush(stdin);
と書くのは動作未定義です。

fflush()は出力バッファをクリアするために使うのでありまして、
入力バッファをカラにするために使う「のではありません」。
    • good
    • 0

> printf("str (%2d)= %s\n", strlen(str), str);


> すると、実施結果は

...とはなりませんよね。 str(XX)=の部分が表示されてませんから。

それはともかく
1行最後まで読み込めたら、改行文字がstrに含まれます。
なので
・str[strlen(str)-1] == '\n' かどうか調べる
→ true: fgetc(fp)などで '\n'になるまで読み飛ばす
というのがやりかたの一つです。

改行無しにEOFになる場合等のエラー処理は忘れずに。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!