• ベストアンサー

cin.get(c)について

テキストを一文字読み込むときは、cin.get(c) と、やりますが、二文字ずつ読み込む方法が分かりません。 cin.read(pch,2)とやればいいという事らしいんですが、これもよく分かりません。 どなたか教えてください。

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

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.3

こんにちは。itohhといいます。 標準入力から2バイトずつ読みとりたいとのことですね? サンプルを載せておきます。 #include <memory.h> #include <string.h> #include <stdio.h> #include<iostream.h> int main() {   char pch[3];      memset(pch, 0x00, sizeof(pch) );      cout<<"Input!\n";      do   {     // NULLクリアしてから2バイト読み込む     memset(pch, 0x00, sizeof(pch) );     cin.getline(pch,3);        cout<<pch<<'\n';   }   while(strlen(pch) == 2);   return 0; } サンプルの説明をします。 各行の先頭には全角スペースを入れてインデントしていますのでコピペするときは 気をつけてください。 標準入力関数(cin)から帰ってくるタイミングはEnterキーを押下した場合です。 この前回答したcin.read関数よりcin.getline関数のほうが便利でした。すみません! pchは、毎回、先頭から設定されますから配列数は3でOKです。 do whileループは、ループの最後に条件を判定します。 while(strlen(pch) == 2); は、「読み込んだ文字列が2バイトの間、ループしなさい」という条件です。 なぜこの条件で良いのかというと漢字を入力していく場合、2バイトで1文字となりますが 半角の英数字を入力した場合で奇数バイトの入力を行ったとき、最後にpchに設定される文字 は1バイトとなります。(以下の例では[7]だけとなる) ただし、2バイト文字(漢字)と1バイト文字(英数字)を混在して入力した場合は、2バイ ト文字がばらばらになる可能性がありますので気をつけてください。 例えば、以下のように実行した場合。 >test Input! 1234567   <---7の次にEnterキーを押下。 12 34 56 7 > という結果になります。 最後に。 >標準入力から読み込むときとファイル指定する場合とではどのように違うんですか? 標準入力では、オープンすることはプログラムを実行した段階で自動的に行ってくれます。 しかし、ファイルから入力する場合は、プログラム内で明示的にファイルを指定してオープン しなければ行けません。また、クローズも同様です。

yabuchanchan
質問者

補足

本当にくわしい御回答ありがとうございます。 結局、2バイトと考えて二文字読みとって行ってるということなんですよね?それでは、100文字ずつ読みとるならば cin.getline(pch,100)としたらいいんですね!!解決しました。 ところで、図々しいようですが、もうひとつ・・・。 たとえば、二文字ずつ読みとっていって、それが特定の二文字、たとえば、 「gc」とかがでてきたら、それをカウントしていきたいんですけど、 そのときに、 if(pch=='gc') count[1]++; というふうにかくと、エラーになってしまいます。一文字のときは大丈夫なのになぜ二文字だとだめなんですか? すいません。時間がありましたらで結構なんで、教えていただければうれしいです。

その他の回答 (3)

回答No.4

横槍気味の回答になりますが。 >if(pch=='gc') これは、"string.h"のstrcomp関数を使います。 この場合なら、 if((strcomp(pch,"gc"))==0) です。 この関数は文字列を比較する関数で、二つの文字列が一緒なら0を返します。 >一文字のときは大丈夫なのになぜ二文字だとだめなんですか? 一文字(半角の)なら、単純にASCIIコードの数値で比較すればオッケーですが、 二文字以上になると数値でってわけに行かなくなるからです。 それから「'(シングルクォート)」は、一文字のコードを表すものです。 例えば'A'はASCIIコードなら65と書いたのと同じことになります。 この場合の「二文字以上がまずい」のはそのせいでもあります。

yabuchanchan
質問者

お礼

非常にわかりやすい御回答ありがとうございました、 お二人には今回非常に有益な回答をしてもらって感謝いたしております。 また、わからないことがあったらここに質問したいと思います。 それにしても、プログラムは奥がふかいですね。 もっと、勉強していきたいです。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 fatal_errorさんありがとうございます。 わたしも解決したのか気になっていました。 cinを使うと言うことは標準入力から(DOS窓でキー入力など)から読み込むと 解釈してお答えしました。 質問者のyabuchanchanさんにお聞きしたいのですが、 A.ファイルを指定して読み込みたい。 B.標準入力から読み込みたい。 もし、Aならfatal_errorさんが回答しているような方法もアリだと思います。 でも、わたしなら、2バイト(2文字?って2バイトのことですよね。)づつ読み込まないで まとめて読み込みます。CFileクラスやCStdioFileクラスなどを使用します。 なぜなら、その都度ファイルのアクセスするのはレスポンスが悪くなるからです。

yabuchanchan
質問者

お礼

お返事、ありがとうございました。 とりあえず、以下のように書くと実行できました。 #include<iostream.h> int main() { char pch[100]; cout<<"Input!\n"; while(pch) { cin.read(pch,2); cout<<pch<<'\n'; } return 0; } でも、ある一定以上の文字をキーボードから入力すると実行できなくなってしまいます。 これはどうしてなんですか?比較的大量のデータを扱いたいんですが・・。

yabuchanchan
質問者

補足

お返事ありがとうございます。標準入力から読み込むときとファイル指定する場合とではどのように違うんですか?

回答No.1

この質問、本来は先の質問で回答されたitohh氏に対して補足すべきかと思いますが... この場合はcinよりも "fstream.h"中のifstremの方が適切ではないでしょうか。 char型の配列(要素数3以上)に二文字ずつ読み込むのなら、 char pch[3]; とでもしておいて ifstreamのread(pch,2)を呼べばいいと思います。 pchには最初ごみが入っているので表示までに pch[2]=0; しておかないと表示がバグりますが。 以下、使用例です。 #include <iostream.h> #include <fstream.h> int main(){ char pch[3]; ifstream readFile("c:\\test.txt"); readFile.read(pch,2); pch[2] = 0; cout << pch << endl; return 0; } 一応、コンパイルして動作確認済みです。 二文字ずつ読み込みたいなら、 while文で繰り返せば良いでしょう。 配列って何?とかいう場合は補足をどうぞ。

yabuchanchan
質問者

補足

レスありがとうございます。そうですね。まずitohhさんに対してするべきですね。でも、ポイント発行しちゃったんで、順番まちがえました。 さて、御回答いただいた内容ちょっとじっくり考えてみたいと思います。 それからまたレスさせていただきたいとおもいます。