• 締切済み

setvbufってどう使うの?

わたしはC言語を勉強している初心者みたいなものですが、関数辞典みたいな本を読んでいてこの関数を知りました。 しかし詳しく書いていないので使い方がいまいちわかりません。 setvbuf(stdin,buf,_IOLBF,sizeof(buf))としたら 入力する場所がbufに変わるのでしょうか? もしそうだとして、stdinを元に戻す方法はどうしたらいいのでしょう?

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 入力する場所がbufに変わるのでしょうか? 入力する場所というのが何を想定しているのか分かりませんが、たぶん違うと思います。 setvbufやsetbufでストリームのバッファを変更しても、結び付けられているファイル等の入出力先が変わるわけではありません。 例えば、コンソールへの出力であれば行バッファリング(_IOLBF)で構いませんが、シリアルポートに出力するのであれば、バッファリングなし(_IONBF)にしておかないと、何か書き込むたびにfflushでバッファをフラッシュしなければ、期待した動作になりません。そういった状況に合わせて適切な制御を行うために、これらの関数は使われます。 > もしそうだとして、stdinを元に戻す方法はどうしたらいいのでしょう? 外しているかもしれませんが、例えばstdinをコンソールではなく、ファイルに結びつけるために変更したいのであれば、freopen関数を使用します。

noname#16765
質問者

補足

>入力する場所というのが何を想定しているのか分かりませんが・・・ これは入力のために文字を一時的に保存するバッファがbufに切り替わるのかと聞きたかったのですが・・・ 確かに文章が短すぎて、聞き方により別のとらえ方も出来ますよね。 >外しているかもしれませんが・・・ 勉強のために読んでいただけなので特に外しているとかはありません。 ただsetvbufはのちのち役に立ちそうだと感じたのできちんとわかっていたほうがいいと思ったので・・・

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>終わったらそれで戻そうかと思ったりもしていたので助かりました。 実際には、元のバッファが使われるワケではない(使われるかもしれないけど)と思いますが、 もし、元と同じ領域のバッファじゃなくても、特別問題があるとは思えません。 ただ、setvbufが成功したかどうかは調べる必要があると思います。 >バッファへのポインタをsetvbufを使う前に保存して… バッファの領域が固定ならそれでいいと思いますが、 もしかしたら、mallocで初期化プログラムで確保されていて、 setvbufした時に解放されているかもしれませんから、 (コンパイラの)実装によっては危険だと思います。

noname#16765
質問者

お礼

確かにmallocなどを使っているプログラムにでこんなことをしたら大変ですね・・・

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

多分、バッファサイズを変更してやることで、入出力の効率を良くする目的で使われるのだと思います。 変更したモノを元に戻すには、 setvbuf(stdin,NULL,_IOLBF,BUFSIZ) としてられば、自動的に標準サイズのバッファが割り当てられます。 BUFSIZは、stdio.hで定義されているstdio用のバッファサイズです。

noname#16765
質問者

お礼

お返事ありがとうございます。 本には「NULLを設定したら自動的に領域を割り当てる」と書いていたので、「どの領域を?」とか思っていたのですがそれでしたか。 出来なかったらstdinのバッファへのポインタをsetvbufを使う前に保存して、終わったらそれで戻そうかと思ったりもしていたので助かりました。

すると、全ての回答が全文表示されます。

関連するQ&A