C言語のfflush()とsetbuf()について

このQ&Aのポイント
  • C言語のfflush関数は、バッファに格納されているデータを吐き出す機能を持っています。
  • fflush(stdin)やfflush(stdout)と記述すると、それぞれ入力バッファや出力バッファをフラッシュすることができます。
  • setbuf関数は、出力バッファをユーザが指定したバッファに設定する機能を持っています。setbuf(stdout, buf)やsetbuf(stdin, buf)と記述することで、指定したバッファを使用するように設定することができます。
回答を見る
  • ベストアンサー

fflush()、setbuf()について

C言語にお詳しい方、ご回答お願いします。 fflush関数は、「バッファに格納されているデータを吐き出す。」とあるのですが、具体的にどのような動作をするのでしょうか? (1)fflush(stdin),fflush(stdout)とそれぞれ記述するとどのような動作をするのか。 (2)データをフラッシュしたいときとは、具体的にどんなときか。(scanfなどで続けてデータの入力を行うこと以外に) setbuf関数は、「出力バッファをユーザバッファに指定」とあるのですが、具体的にどういう意味なのでしょうか? (1)setbuf(stdout,buf)、setbuf(stdin,buf)とそれぞれ記述するとどのような動作をするのか。 よろしくお願いします。

  • j_i_t
  • お礼率72% (13/18)

質問者が選んだベストアンサー

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

> (1)fflush(stdin),fflush(stdout)とそれぞれ記述するとどのような動作をするのか。 fflush(stdin)とすると動作が未定義になります。したがって、何がおきるか分かりません。 fflush(stdout)の場合は、printf等で出力したけれども、まだバッファにたまっている文字が実際の装置(コンソールやファイルなど)に出力されます。 > (2)データをフラッシュしたいときとは、具体的にどんなときか。(scanfなどで続けてデータの入力を行うこと以外に) 例えば、相手と対話的にやり取りを行う必要がある場合などです。シリアルポート等で通信を行う場合はもちろん、次のようなケースも考えられます。 fputs("入力> ", stdout); fgets(str, sizeof(str), stdin); 上の例では、"入力> "がコンソールに出力される前にfgetsが入力を求めてしまうかもしれません。そのため、fgetsの前にfflush(stdout);を挿入することで、入力を求める前に"入力> "が確実に出力されるようになります。 なお、「scanfなどで続けてデータの入力を行うこと」に対しては、fflushは何の役にも立ちません。 > (1)setbuf(stdout,buf)、setbuf(stdin,buf)とそれぞれ記述するとどのような動作をするのか。 stdoutまたはstdinが管理するバッファをbufに設定し、フルバッファリングを行います。デフォルトでは、stdoutやstdinがどんなバッファリングを行うかは環境に依存します。

j_i_t
質問者

お礼

お礼が遅くなってしまってすいません。 おかげさまで理解が深まりました。 ありがとうございました。

関連するQ&A

  • C言語 ドラッグとファイル名の表示

    はじめまして。 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; }

  • fflush(stdin)の使い方とprintf()関数getchar()関数の違いについて

    はじめまして。 現在c++を勉強し始めて1週間の初心者です。 fflush(stdin)について質問です。下記のプログラムで小文字入力したアルファベット1文字を大文字に変換して出力しています。方法(1)ではgetchar()関数とputchar()関数を使用していますがどうしてこの場合にはfflush(stdin)が必要となり、方法(2)のprintf()関数とscanf()関数を使用した場合はfflush(stdin)が必要ないのでしょうか?どなたか私のような初心者でも分かるように詳しく説明してもらいたいです。 何故かプログラムを書いているとprintf()とscanf()がよく混乱します。原因として、printf()を先に書く場合と、scanf()を先に書く場合が有るからだと思っているのですが、まだよく理屈の理解ができません。なので出来ればこれらの関数についても基本的な概念を教えていただきたいです。それと方法(2)では何故最後にscanf(%c):が無くても良いのかも良く理解できません。 どなたか是非とも回答宜しくお願いします。 #include <stdio> main void() { 方法(1) printf("\n文字を1つ入力してください:"); fflush(stdin);    char ch=getchar(); ch=ch-32; putchar(ch);    方法(2) printf("\n文字を1つ入力してください:") //fflush(stdin);必要なし???    char ch; scanf("%c",&ch); ch=ch-32; printf("%c",ch);    //scanf(%c):??? }

  • %sの使い方について教えてください。

    %sの使い方について教えてください。 char c[4] = "abc" printf("%s",c); この関数は%sでcのアドレス(&c[0])を読み込み、stdoutにそのアドレスを書込み、文字列abcが表示されると認識しています。 printf("%s",stdin); とすればstdinのアドレスがstdoutに書き込まれて標準入力が表示されると思っていたのですが、実際はprintf("%s",*stdin)としなければ出力されませんなぜでしょうか? 回答をよろしくお願いします。 もう一つ別件なのですが、printf("%d",sizeof *stdin); と入力すると、32と出力されます。 なので、stdinは32バイトの大きさだと認識したのですが、char型の文字が32文字以上を書き込むことができます。(scanf()で入力が失敗して32文字以上の文字をバッファに保管できるということです。) これはどういうことでしょうか、分かる方是非、回答をよろしくお願いします。

  • stdin,stdoutについて

    C言語を学び始めたものです stdin・stdoutがどのように機能するか分かりません またstdoutはどこに出力しているんですか #include <stdio.h> int main(void) { char ch; while(!feof(stdin)) { scanf("%c", &ch); if(!feof(stdin)) printf("%c", ch); } return 0; } このプログラムは「コンソール」入出力関数だけを使用しテキストファイルの内容を別のテキストファイルにコピーするプログラムだそうですがどのテキストファイルの内容をどこのテキストファイルにコピーしているんですか?stdin・stdoutの機能が全く分かりません。 どなたか分かる方、回答お願いします。

  • fgetsとsscanf

    C言語の勉強をしております。 初歩的な質問なのかもしれないですが、 char buf[80]; char data[32]; fgets(buf,sizeof(buf),stdin); sscanf(data, "%s", buf); と、 fgets(data, sizeof(buf), stdin); は何が違うのでしょう? 他の質問内容やネットで探してみたんですが、基本的には組み合わせて使用されているみたいなんですが、必要性がわかりません・・・。 例えば、fgetsで構造体のメンバ(文字配列)へキーボードからデータを入力したい場合は、どちらで行うのが良いのでしょう? また、入力データが未入力かどうか判断させるには、 fgets(buf,sizeof(buf),stdin); if(buffer[0] == '\n'){   /* ループを抜ける */   break; } で良いですよね? ※関連している質問 http://oshiete1.goo.ne.jp/qa4438371.html あと、同じ処理内で、getsやscanfを混同して使用すると、どこかの入力時に改行がバッファに残ってしまい、入力処理が飛ばされてしまいますか? 以上、よろしくお願いいたします。

  • setvbufってどう使うの?

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

  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • fgetsでファイルの内容を読み込む

    キーボードから読みたいファイル名を入力し 指定した行数だけファイルの内容を出力する プログラムを作りました。 ちゃんと動作するソースは作れたのですが、 へんなところ(無駄な文など)がないか どなたか見て頂けないでしょうか。 ソースが長くて申し訳ありません。 課題で、答えはあるのですが、ソースを チェックしてもらえる人が回りに いない状況です。 どうぞ宜しくお願いします。 printf("出力するファイル名を入力してください-->"); gets(s); while((fp = fopen(s, "r")) == NULL) { printf("指定されたファイルがありません\n"); printf("再度入力して下さい-->"); fflush(stdin); gets(s); } printf("出力する行数を入力して下さい-->"); fflush(stdin); scanf("%d",&l); while(fgets(s, 256, fp)!=NULL){ printf("%s", s); l--; if(l==0){ fclose(fp); return 0; } } fclose(fp);

  • メッセージ機能でのフラッシュについて

    こんばんは。 またなのですが、サンプルプログラムに疑問点があるので質問させてください。 今、メッセージ機能を用いてプロセス間でデータを受け渡しするプログラムについて考えています。 サンプルを見ると、 送信側では("メッセージを入力してください")というようなことがprintfされていて、そのあとでfflush(stdout)をしています。 受信側では受け取ったメッセージをwhile(1)の中で出力しているのですが、こちらはfflushしていません。 fflushはどんな時に必要なのでしょうか。 なぜ送信側ではして、受信側ではしていないのですか。 分る方がいたら回答よろしくお願いします。

  • VC++EEの設定 自動補完、強調など

    私はごく最近C言語を学び始めた大学生です。 数日前、C言語の統合開発環境として "Visual C++ Express Edition" を利用しはじめました。 以前は学校の先生に進められた "Eclipse 3.3 europa" を使っていたのですが、scanfやgetsなどを使うと書籍に 書いてあるプログラムさえ動かないのが気になって (scanfはfflush(stdout);を直前に入れて対策をするように習いました) VC++EEに手を出しました。 しかし、実際VC++を使ってみるとEclipseのような自動補完 ( ',",{ などを打つと ',", }をそれぞれ補完してくれたり) や標準ライブラリ関数の強調ができずに エディターとしての機能が使いこなせていません。 ヘルプなどでオートコンプリートで検索しましたが解決法が分からず、 教えてgooの過去ログを調べてみましたがそれらしいものは見つかりませんでした。 ・どなたかVC++のエディターで自動補完機能の利用や、  ライブラリ関数の強調などの設定のお分かりになる方が  いらっしゃいましたら教えていただきたく思います。  /*もしかしたらできないのでしょうか?*/ ・また、ここの設定をいじるともっとエディターが使いやすくなる  というようなポイントをご存知の方もぜひその設定を教えてください。 よろしくお願いします。

専門家に質問してみよう