• ベストアンサー

バッファを消したいのですが・・

Cではバッファを消すために fflsuh(stdin) とすればできたいのですが、 C++ではどのようにバッファを消せばよいのでしょうか? ご教授のほどよろしくお願いします。

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

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

#7です。 くどくなってきたので、この辺で終わりにします。 よく考えてみると、WinMainやwmainを処理系が予約するのはまずいですね。それだと規格厳密合致プログラムの動作を変更してしまいます。 というわけで、上記の場合は、少なくとも規格合致処理系とはいえないはずです。 未定義の動作は、文書化すれば、期待した動作になるように処理してもかまわないわけですが、それは任意の規格厳密合致プログラムの動作を変更しない場合に限られます。 fflushのような関数の機能を少し追加するのとは、やはりわけが違いますね。

その他の回答 (7)

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

>#6 > C99は知りませんが、JIS-Cでは違います。 JIS-Cといわれているのがどのバージョンかわかりませんが、最新のJIS X3010:2003のことであれば、それはいわゆるC99すなわちISO/IEC 9899:1999に対応するものです。(これはJIS X3010:1999の最初のページを読めば分かります) 次に、Visual C++がどの規格バージョンをもとにしているかについてですが、これは__STDC_VERSION__マクロを調べれば分かります。すなわち、 ・__STDC_VERSION__が定義されない。→ C90 ・__STDC_VERSION__が199409L → C90 + AMD1 (C95) ・__STDC_VERSION__が199901L → C99 ということです。実際に調べてみると、__STDC_VERSION__は定義されていませんので、C90であろうと推測できます。 C90であれば、プログラムの開始はmainでなければならず、その返却型はint型でなければなりません。規格上、「~でなければならない」となっている事項が守られていない場合の動作は未定義ですので、確かに、文書化されていれば、返却型がvoidだろうが、WinMainやwmainであろうがOKといえばOKなのですが、それを言い出せば、文書化さえしていればC#の文法で書かれたソース(Cとしては未定義の動作)が、そのまま通用してもOKになってしまいますね。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.6

ANo.4の >未定義の動作というのは、文書化された、環境特有の方法で処理してもよいことになっているので、Visual C++の場合はこれに相当するかと思います。 >(いや、mainの返却値がvoidでもよかったり、WinMain云々ということを考えると、そもそも非標準処理系なのか...) C99は知りませんが、JIS-Cでは違います。 「mainの返却値がvoidでもよかったり、WinMain云々」は未定義ではなく未規定です。 以下はJIS-Cからの引用 >3.4.4 未規定の動作 この規格が、二つ以上の可能性を提供し、個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。 >    例 未規定の動作の例としては、関数の実引数の評価順序がある。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

# undefined behaviorの定義は知ってますが、書き方が悪かったらしいです。 質問内容からVCをお使いなんだろうと勝手に推測してるわけですが、 ・VCは、なぜかそういう仕様を謳っている(VCの独自仕様では可能) ・C言語(一般)としては未定義動作  1.バッファを消す機能の仕様はない(一般には不可能⇒読み捨てる処理を書く)  2.結果の保証もない(他の意図しない結果をもたらす可能性)

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

既に回答が出ているように、fflush(stdin)は未定義の動作になります。 (fflsuhはfflushの間違いですよね。本当にfflsuhという関数があるのなら、それについて補足してください。) 未定義の動作というのは、文書化された、環境特有の方法で処理してもよいことになっているので、Visual C++の場合はこれに相当するかと思います。 (いや、mainの返却値がvoidでもよかったり、WinMain云々ということを考えると、そもそも非標準処理系なのか...) したがって、そもそもCとしてはできないことなので、 > C++ではどのようにバッファを消せばよいのでしょうか? C++でそれに対応するものもありません。 ほとんど#3の回答と同じですが、処理系のマニュアルに記載されていれば、結果が保証されうることのみ指摘しておきます。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

istream/ostreamの回答は出てますので、もう少し根本的な指摘を。 誤解してそうな気もしますが、 fflush(stdin)はC言語の言語仕様(ISO/IEC9899)では「未定義動作」です。 なぜか、MicrosoftのVCは「バッファの内容を消去する」仕様を謳ってますが、 これはあくまでVC独自のものであって、C言語としてはfflushで入力バッファを消すことはできません。ご注意を。 # 未定義動作なので、そもそも結果が保証されません。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

istream の話なら istream::ignore(streamsize n, int delim) ではアカンの?ちゅうか入力ストリームをフラッシュする状況がわからん。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

ostreamでの話なら、 cout << flush; ――とか。

関連するQ&A

  • fgetsなどのときのstdinのバッファを消すには?

    こんにちは,今C(C++でない)を使用しています。 たとえば, char str[20] fgets(str,sizeof(str),stdin) としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。 C++などでは fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。 よろしくお願いします。

  • 端末ドライバのバッファやstdinバッファの中身を覗くには?

    select関数についての振舞いについて調べています。 (Win2k+Cygwin) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <sys/types.h> #include <curses.h> #include <signal.h> #include <unistd.h> //=================== void session_loop(){ fd_set mask; FD_ZERO(&mask); FD_SET(0,&mask); fd_set readOK; int width=1; char c; printf("う\n"); while(1){ printf("あ\n"); readOK=mask; printf("こwidth=%d\n",width); select(width,(fd_set *)&readOK,NULL,NULL,NULL); printf("け\n"); if ( FD_ISSET(0, &readOK ) ){ printf("い\n"); c=getchar(); //getcharはバッファリングあり関数 printf("c=%c\n",c); printf("さ\n"); } } } //================= int main(void){ session_loop(); return 0; } というリストで 端末ドライババッファやstdinバッファの振舞いについて学習しています。 端末ドライバにバッファリングされた文字群がgetchar関数のread要求とかでstdinバッファに排出される様子や stdinバッファの文字群がgetchar関数の読込み毎に減っていく様子を垣間見たく思っています。 端末ドライバのバッファやstdinバッファの中身を覗くにはどうすればいいのでしょうか?

  • バッファオーバーランについて

    C言語のプログラミングファイルを読み込んで、バッファオーバーランの危険性を検出するプログラムを作りたいのですが、どうしたら良いか分かりません。 どなたかご教授お願いします

  • バッファとは何ですか

    C言語を使用してるとバッファという言葉がよく出てきますがバッファとは何ですか メモリとは違うものですか 訳をみても緩衝材とか一時的に蓄える場所という意味でよく分かりません 一時的でない使い方も多い気がしますが実際はどういうものですか

  • バッファについて。

    C言語使われているバッファとはどういう意味でしょうか?stdio.hとファイル名のところで出てきました。教えていただけると助かります。すみません。

  • ダブルバッファ法を教えて下さい

    通信系のプログラムを作っているのですが、まったく分からなくて困っています。二つのメモリを確保し、まずバッファAが受信します。バッファAがいっぱいになるとバッファAはHDDに書き込みその間にバッファBで受信を行います。バッファBがいっぱいになるとHDDに書き込み、その間にバッファAが受信する・・・という風なサイクルでプログラムを動かしたいのですが、よろしくお願いします。C・C++で書かれたソースプログラムを下さい。

  • 非バッファーって何ですか?

    マザーボードの説明書に「非バッファーDIMM」と書いてあるのですが、この非バッファーとはどう言う意味でしょうか?

  • バッファ中、とは?

    メディアプレイヤーで動画を見ているのですが、見ている途中に「バッファ中です」と表示されて映像が止まってしまうことが良くあります。 「バッファ中」とはどういうことなのでしょうか。 これをどうすればスムーズにとめることなくみることができるのでしょうか。

  • バッファ

    MOにもZIPにもバッファというものがあります。 これは、高速なCPUと処理の遅い周辺機器とのや り取りをスムーズにするためにデータを一時蓄 えておく機能でよろしいでしょうか。 スーパーディスクには20MBなんてのもあるのに、 どうしてMOでは2MBで済むんでしょうか。また、 カタログによっては、バッファが書いてなくて、 キャッシュ、という表示になっているものも あります。キャッシュ=バッファでしょうか? もう一点追加でお願いします。バッファ=キャッシュですが、 最近のMOにはこの数字がないものがあります。カタログには なにも載っていないのですが、これはどうしてでしょうか。

  • バッファについて

    MOにもZIPにもバッファというものがあります。 これは、高速なCPUと処理の遅い周辺機器とのや り取りをスムーズにするためにデータを一時蓄 えておく機能でよろしいでしょうか。 スーパーディスクには20MBなんてのもあるのに、 どうしてMOでは2MBで済むんでしょうか。また、 カタログによっては、バッファが書いてなくて、 キャッシュ、という表示になっているものも あります。キャッシュ=バッファでしょうか?

専門家に質問してみよう