dポイントプレゼントキャンペーン実施中!

はじめまして。

C言語を学習しています。

PCのOSはWindows XPです。

ドラッグしたファイルのファイル名を表示する方法として参考書に例文が載っていますが、以下の部分が理解できません。

1、参考書に、「【fflush(stdin);】という記述は、出力バッファを強制出力する関数である fflush で、入力バッファである stdin をクリアしています。」との説明があります。
出力バッファの意味と入力バッファであるstdinについての説明が参考書に無く、ネットで調べましたが理解できる記事がありませんでした。
出力バッファの意味と入力バッファであるstdinの意味を教えてください。

2、【getchar();】は、実行されるとキーボードからの入力を待ち、エンターキーが押されると入力待ちを終了、入力したうちの1文字目を返り値として返す関数とのことですが、下記のプログラムでどのような役割をしているのか教えてください(下記のプログラムになぜgetchar関数が必要なのかがわかりません)。

なにとぞ、よろしくお願い致します。

●参考書の例文

次のプログラムは、プログラム実行画面(コマンドプロンプトのような黒い画面)にデスクトップ等のファイルをドラッグし、そのファイル名を表示する例です。

#include <stdio.h>

int main(int argc,char *argv[])
{
if (argc > 1) {
printf("%s\n",argv[1]);
}

fflush(stdin);
getchar();

return 0;
}

A 回答 (3件)

(1)


stdinは「標準入力」 stdoutは「標準出力」を stdio.h の関数で使うためのFILE *型の変数です。
printf("A") と fprintf(stdout, "A")
が同じ動作になります。

通常は、stdinはキーボードからの入力に、stdoutは画面への出力に割り当てられています。
そのため、初級の入門書では getchar等の標準入力から入力する関数を「キーボードから入力」, printf等の標準出力に出力する関数を「画面へ出力」と記述しているケースがあります。
詳しくは「標準入出力」で検索。


ファイル入出力には、「バッファ」と呼ばれる一時記憶領域があります。
fputchar(c,fp) ;
としても、その瞬間にファイルに書き込まれるのではなく、一旦バッファに保存されます。
バッファが一杯になる、(行バッファの場合)改行になる、といったタイミングで、ファイルに書き込まれます。(そして、バッファはクリアされます)

また、入力時には、ある程度まとめて読み出します。

printf等の出力先である標準出力stdout、scanf等の入力先であるstdinも同様、ファイル扱いになり、バッファリングされることがあります。

より詳しくは「ファイル バッファリング」で検索。

fflushは、上記のようなバッファに溜ったデータを、従来の書き出しタイミングを無視して、強制的に書き出して、クリアするものです。

**** stdinのような「入力」に対して使った場合、どうなるか決まっていません ****
http://www.kijineko.co.jp/tech/superstitions/ffl …

ただ、Visual Cでは、独自の仕様として、「入力バッファのクリア」になります。
他のC言語では使えないので、注意してください。

(2)
Windowsのコンソール用アプリケーションを、ダブルクリックやドラッグ&ドロップで実行したとき、コマンドプロンプトみたいなウィンドウが出て実行が始まり、終了と同時に閉じます。
一瞬で終わるプログラムだと、画面に表示された内容を読むのは無理です。

その対策の一つとして
「プログラム終了直前にキー入力を待って、入力があったら終了する」
というものです。入力があるまでは実行中なので、ウィンドウは閉じません。

キー入力待ちの方法はいくつかありますが、その一つがgetchar()を使うものです。
このときstdinのバッファになにか入っていると、キー入力を待たずにバッファから読み込んでしまうので、その前にバッファをクリアしておく、というのがこの部分の意図です。



ちなみに、このプログラムは「コマンドラインの第1引数を出力する」プログラムです。
ドラッグ&ドロップで実行すると、コマンドライン引数にそのファイルを指定した状態で実行される、というWIndowsの動作を利用しています。
「ファイルをドラッグし、そのファイル名を表示する」というのは正確ではありません。

標準入出力とかバッファリングの説明が無い(または不十分)というのは、C言語の勉強用としては問題有りだと思います。
他の参考書も買って、併用する(あるいは、今の本は捨てる)ことを強くお勧めします。
他の参考書は、Visual Stdioに特化していない物がいいです。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/08/17 21:32

とりあえず参考書を読むときは使用されてる開発環境のライブラリのマニュアルも一緒に読まれる方がいいと思います。



1. stdinは、Cのランタイムライブラリが標準入力に対して自動でfopen()してくれてるものです(なのでstdinの型はFILE *)。またバッファリング機能はありますがそれはstdin(というより"r"でfopen()されたもの)の一機能であって、stdin=入力バッファというわけではありません。
fflush()でフラッシュされるバッファというのは"w"などでfopen()されたストリームが持ってるバッファの事です。fflush(stdin)についてはどう処理されるかは決められてませんので処理系により異なります。またCのランタイムライブラリが標準出力に対して自動的にfopen()しているものがstdoutになります。

ちなみにstdinやstdoutは知らず知らずによく使ってると思いますよ。
getchar() getc(stdin)の省略形
scanf(~) fscanf(stdin,~)の省略形
printf(~) fprintf(stdout,~)の省略形

それとOSがバッファリングの内容を自動的に処理するということはないです。

2. #1の方の説明の通り。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/08/17 21:33

1.


バッファとは、文字などのデータを一時的に蓄えておく場所です。
printfやputsなどを使うと、標準出力(stdout)と呼ばれるバッファに文字列が送られます。
そうしておくとOSなどが勝手にバッファから文字列を取り出して、画面に出力してくれる仕組みです。
なぜバッファを使うのかというのはハードウェアの話になりますが、端的に言うとその方が効率が良いからです。

プログラムから見て、外に出力するためのバッファを出力バッファ。
逆に外からの入力を受け取るためのバッファを入力バッファと言います。
先ほどの標準出力はその名の通り出力バッファで、stdin(標準入力)は入力バッファです。
ちなみにstdinはキーボードからの入力を蓄えるバッファです。

fflushはバッファをフラッシュする関数です。
最初にOSなどが勝手にバッファから文字列を取り出すと言いましたが、これをプログラム側から強制的にやらせるための関数です。
これを入力バッファに対して使うと、溜まっているデータを捨てることになります。

参考書の記述は、「【fflush(stdin);】という記述は、バッファを強制フラッシュする関数である fflush で、入力バッファである stdin をクリアしています。」という意味だと思います。

2.
ユーザがエンターキーを押すのを待つためにあります。
プログラムの動作には不要なものですが、入門書ではよく使われるテクニックです。
Windowsなどの環境では、通常プログラム実行画面(コマンドプロンプトのような黒い画面)はプログラムが終了すると勝手に閉じてしまいます。
初心者の方はそこでつまづくことが多いので、getcharを入れて待つようにしてあります。
それだけの役割なので、自分でプログラムを書くときは入れなくても問題ありません。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/08/17 21:32

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