- ベストアンサー
C言語 バッファについて。
すみません。C言語を記述する際、バッファはどのように使われているのでしょうか?また、バッファがないとどうなるのでしょうか?なるべく簡単に教えて頂けると幸いです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> 例えば、Cドライブに、フォルダを作って、その中に、C言語で書いたファイルがあって、それをコマンドプロンプトにコマンドを入れて、コマンドプロンプトに出力させる。のも、ファイルの読み込みなのでしょうか? もちろんその通りです。 なにかのプログラムを使って プログラムを書いたあるファイルを読み込み なにかの処理をして、画面に出力 という ことですね。 うーん。それにしても本題からも、 このコーナー(C,C++,C#) からも 質問内容が離れすぎてます。 C言語以前の問題なので、ご自身で基礎的なところから学習されて どうしもわからないことが出てきたら その内容にあう適切なコーナーでご質問し直されてください。 (そのほうが回答を待つひつようがなく、学習に無駄がありません)
その他の回答 (5)
- superside0
- ベストアンサー率64% (461/711)
> ファイルからの入力とは、どういう事でしょうか? 本題ではないのではありますが、一応。。。 ファイルからの入力っていう言い方がわかりにくかったですかね。 ファイルから読み込む ということです。 プログラムって ざっくりいうと 入力 ↓ 処理 ↓ 出力 を行うものです。 入力っていうのは、 キーボードやマウスからの入力を受け付けたり 事前にファイルとして用意しておいてそこから読み込むとか Webブラウザから送られてくる通信データを受け付けたりとか データベースからデータを読み込んだりとか IOに接続されたセンターから読み込んだりとか 用途によっていろいろあります。 それを、プログラム内ので処理した上で出力させます。 その出力先も、いろいろで 画面に表示したり ファイルに書き込んだり 遠隔のブラウザに戻して表示させたり データベースに書き込んだり モーターを動かす命令を入れたり って感じで、これも用途によっていろいろですね。 バッファに話を戻しますが ・テキストファイルから1文字ごとに読み込んで処理する方法 ・テキストファイルから文字列(分節)ごとにバッファに読み込んで処理する方法 ・テキストファイルの1行ぶんをバッファに読み込んで処理する方法 のどれで作るかというのも、用途次第です。
- superside0
- ベストアンサー率64% (461/711)
補足でのご質問の詳細は後述しますが、まずは、 バッファなしでプログラムを作ることは、工夫すれば可能だけど 文字列(1文字でなく複数の文字)を扱う場合には、 バッファに入れて文字のまとまりで一括で処理したほうが簡単だし シンプルなぶんだけ、バグを生む可能性も低くなる ということを理解して頂くのが、私からの回答の目的でした。 > 1文字目の'1'を取り込み、それを整数値に変換してレジスタに1を保存 >2文字目が数値なら、先の1を10倍して10 とし、それに2を加算して 12 >。。。繰り返し。。。 >の所で、12の繰り返しの部分の所は、必要ないのではないか? 説明が長くなるので、はしょりましたが 必ず2文字で入力されるということなら、おっしゃる通り必要ないです。 しかし、任意の長さの数字に対応するプログラムを バッファを使わないで作るのであれば、 たとえば "4321"のときは '4'→4 '3'で (前の4 x10)+ 3 →43 '2'で (前の43 x10)+2 →432 '1'で (前の432x10)+1 →4321 と1文字読むごとに処理する形で 数字が連続する間はずっと繰り返すという 仕組みにする必要があります。 > 後、整数値に変換するには、どの様な処理をするのでしょうか? 1という文字がファイルやキーボードから入力されたときの値は 数値の1でななく、ASCIIコードの'1'で入っています。 '1'のASCIIコードの値を10進数で表すと49です。 同様に数字の'9'が入力されたときは、10進数で57で入っています。 です。 つまり、ファイルやキーボードから入力された1文字が、 '0'~'9'であれば、値から10進数の48を引くことで1桁分の整数値となります。 とまぁ、こんなところから、細かくプログラミングするのは 勉強にはなるでしょうけど、実務としては無駄なコードだし、 他人がメンテンナンスするときにわかりにくいし バグを作る可能性も高いので、 一般的にはバッファを使って読んでから i = atoi(バッファ); とします。これなら1行ですむわけです。 > 後、2文字目が文字ならどうなるのでしょうか? どう作るかは、そのプログラムの仕様次第です。 2文字目が数字でないときは、エラーとするのか 2文字目を無視して、1文字目だけを整数値にするのか '+' '-' 'x' '/'といった四則演算用の文字がきたら そのあとのに続く数値とで計算させるのか といった仕様によって プログラムは変わってきます。 ですが、それは、バッファを使ったほうが プログラムが簡単になる、という本件とは別の話ですね。 > !strcmpの!は、どういう意味でしょうか? strcmp(文字列1, 文字列2 )は C言語の標準ライブラリとして用意された 2つの文字列を比較する汎用関数ですが 先頭から比較していって文字列1のほうが大きい時 →正の値 先頭から比較していって文字列1のほうが小さい時→負の値 等しいとき → 0 を返してくれます。 (文字列を並べ替えるときには、2つの文字列が同じか同じでないか だけでなくて、大きい小さいも判定できたほうが便利ですから) ただ、strcmp( )を初めて使うときは違和感があるかと思いますが 同じときに 0 となるということは、 if文で2つの文字列が同じかを判定する際には、strcmpの結果が、 0のときは論理を真(0以外) 0でないときは論理を偽 (0) と論理を反転させる必要があるので、 strcmpの前に、! をつけて反転させます。 ! は Notとか 否定という意味のC言語の命令です。 なので、 if ( ! strcmp(バッファ."ABC") ) { // バッファに溜めておいた文字列が"ABC"のときはここが実行される } というコードになるわけです。 ちなみに、!のあとに空白があってもなくても構いません。
補足
すみません。大変恐縮なのですが、ファイルやキーボードから入力の所で、ファイルからの入力とは、どういう事でしょうか?キーボードの入力の方は、分かるのですが。教えて頂けると幸いです。
- superside0
- ベストアンサー率64% (461/711)
ファイルやキーボードから 1文字入力されてその内容で処理をして 次の1文字を入力するときに 前の文字は不要なので捨ててしまってよい というプログラムなら バッファは必要ありません。 しかし、ファイルやキーボードから 任意の文字列が入力されたとき、 それが"ABC"ならどうする・"ABC"じゃないときはどうする というプログラムをつくのであれば 1文字ごとに入力されたときそれを バッファに "A" "AB" "ABC" ためていって、バッファの内容が、"ABC"と一致するかを if ( !strcmp(バッファ,"ABC") ) で判定することになります。 文字列だけでなく ”12” と入力されたとき、数値の12だと認識させるには バッファなしだと、 1文字目の'1'を取り込み、それを整数値に変換してレジスタに1を保存 2文字目が数値なら、先の1を10倍して10 とし、それに2を加算して 12 。。。繰り返し。。。 みたいなことをしないと行けなくなりますが 一旦、バッファに "12"の2文字で取り込んでしまえば この文字列から整数変換するのは atoi(バッファ)の 1回ですみますしね。
お礼
すみません。 !strcmpの!は、どういう意味でしょうか?教えて頂けると幸いです。
補足
1文字目の'1'を取り込み、それを整数値に変換してレジスタに1を保存 2文字目が数値なら、先の1を10倍して10 とし、それに2を加算して 12 。。。繰り返し。。。 の所で、12の繰り返しの部分の所は、必要ないのではないか?後、整数値に変換するには、どの様な処理をするのでしょうか?後、2文字目が文字ならどうなるのでしょうか?教えて頂けると幸いです。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>バッファはどのように使われているのでしょうか? バッファが一番多く使われるのは、キーボードからの入力と、テキストファイルの入力と出力。 >バッファがないとどうなるのでしょうか? キーボードから正常に入力出来なくなり、テキストファイルから正常に読めなくなり、テキストファイルに正常に書き出せなくなります。
お礼
バッファがないと、キーボードからの入力がなぜ正常に出来なくなるのでしょうか?
補足
つまり、テキストファイルが文字化けすると言う事ででしょうか?教えて頂けると幸いです。
- f272
- ベストアンサー率46% (8467/18126)
バッファにデータを貯めておきバッファが空になるかいっぱいになるとまとめてファイル入出力を行うというのがバッファの標準的な使い方です。 /usr/include/stdio.hでバッファサイズが定義されています。 fopen, fread, fwrite, fcloseを使うときには,この内部バッファを利用します。ファイルポインタに自動的に割り当てられるバッファの代わりにsetvbufを使って入出力バッファとして利用する領域を指定することができます。 open, read, write, closeを使うときには,内部バッファを利用せずに直接にディスクに対してファイルの読み書きをします。
補足
例えば、Cドライブに、フォルダを作って、その中に、C言語で書いたファイルがあって、それをコマンドプロンプトにコマンドを入れて、コマンドプロンプトに出力させる。のも、ファイルの読み込みなのでしょうか?教えて頂けると幸いです。