![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
はじめまして。
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;
}
No.2ベストアンサー
- 回答日時:
(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に特化していない物がいいです。
No.3
- 回答日時:
とりあえず参考書を読むときは使用されてる開発環境のライブラリのマニュアルも一緒に読まれる方がいいと思います。
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の方の説明の通り。
No.1
- 回答日時:
1.
バッファとは、文字などのデータを一時的に蓄えておく場所です。
printfやputsなどを使うと、標準出力(stdout)と呼ばれるバッファに文字列が送られます。
そうしておくとOSなどが勝手にバッファから文字列を取り出して、画面に出力してくれる仕組みです。
なぜバッファを使うのかというのはハードウェアの話になりますが、端的に言うとその方が効率が良いからです。
プログラムから見て、外に出力するためのバッファを出力バッファ。
逆に外からの入力を受け取るためのバッファを入力バッファと言います。
先ほどの標準出力はその名の通り出力バッファで、stdin(標準入力)は入力バッファです。
ちなみにstdinはキーボードからの入力を蓄えるバッファです。
fflushはバッファをフラッシュする関数です。
最初にOSなどが勝手にバッファから文字列を取り出すと言いましたが、これをプログラム側から強制的にやらせるための関数です。
これを入力バッファに対して使うと、溜まっているデータを捨てることになります。
参考書の記述は、「【fflush(stdin);】という記述は、バッファを強制フラッシュする関数である fflush で、入力バッファである stdin をクリアしています。」という意味だと思います。
2.
ユーザがエンターキーを押すのを待つためにあります。
プログラムの動作には不要なものですが、入門書ではよく使われるテクニックです。
Windowsなどの環境では、通常プログラム実行画面(コマンドプロンプトのような黒い画面)はプログラムが終了すると勝手に閉じてしまいます。
初心者の方はそこでつまづくことが多いので、getcharを入れて待つようにしてあります。
それだけの役割なので、自分でプログラムを書くときは入れなくても問題ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語について。 7 2023/01/26 16:42
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドセーフでないAPIをマル...
-
VC++でUTF-8のファイルを出力し...
-
ラストです!! このプログラム...
-
コマンドライン引数の区別【C言...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
MATLABのCSV形式での書き込みに...
-
VBA でメモ帳へ保存する際の保...
-
井戸型ポテンシャルの数値解シ...
-
コマンド(例えばls)の出力結果...
-
フォルダー、ファイル名を一括...
-
VBScriptのReadTextについて
-
Fortoran
-
Accessでのレポート印刷待機方法
-
構造体のファイル出力
-
CADの無い環境の得意先に図面を...
-
複数のC言語プログラムが,一つ...
-
テキストファイルを標準出力し...
-
TeXで使用するFONTを作成しよ...
-
マイクラでPythonのプログラミ...
-
パラメータが正しくありません...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Paiza Cloudです。 どうやれば...
-
Paiza Cloudです。学籍番号と氏...
-
Acccess レポートをグループ別...
-
ファイル出力の場所を指定
-
コマンド(例えばls)の出力結果...
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
VBA でメモ帳へ保存する際の保...
-
ファイル形式またはファイル拡...
-
fortranのtxtファイル出力書式...
-
CSV形式に変換
-
printfだと出力されるのにfprin...
-
C++ fprintf_sの使い方がわからん
-
c言語の質問です。 ランダムに4...
-
Wordマクロで指定したフォルダ...
-
C++/CLIにて、System.String^型...
-
pcap形式データをテキストへ抽出
-
二次元配列をクリップボードに...
-
raw形式からbmp形式への書き込...
おすすめ情報