OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

cin.get(c)について

  • 困ってます
  • 質問No.170464
  • 閲覧数669
  • ありがとう数5
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 60% (108/179)

テキストを一文字読み込むときは、cin.get(c)
と、やりますが、二文字ずつ読み込む方法が分かりません。
cin.read(pch,2)とやればいいという事らしいんですが、これもよく分かりません。
どなたか教えてください。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル12

ベストアンサー率 45% (210/459)

こんにちは。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

お礼率 60% (108/179)

本当にくわしい御回答ありがとうございます。
結局、2バイトと考えて二文字読みとって行ってるということなんですよね?それでは、100文字ずつ読みとるならば
cin.getline(pch,100)としたらいいんですね!!解決しました。

ところで、図々しいようですが、もうひとつ・・・。
たとえば、二文字ずつ読みとっていって、それが特定の二文字、たとえば、
「gc」とかがでてきたら、それをカウントしていきたいんですけど、
そのときに、
if(pch=='gc')
count[1]++;
というふうにかくと、エラーになってしまいます。一文字のときは大丈夫なのになぜ二文字だとだめなんですか?

すいません。時間がありましたらで結構なんで、教えていただければうれしいです。
投稿日時 - 2001-11-21 15:46:15
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル8

ベストアンサー率 39% (23/58)

この質問、本来は先の質問で回答されたitohh氏に対して補足すべきかと思いますが... この場合はcinよりも "fstream.h"中のifstremの方が適切ではないでしょうか。 char型の配列(要素数3以上)に二文字ずつ読み込むのなら、 char pch[3]; とでもしておいて ifstreamのread(pch,2)を呼べばいいと思います。 pch ...続きを読む
この質問、本来は先の質問で回答された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

お礼率 60% (108/179)

レスありがとうございます。そうですね。まずitohhさんに対してするべきですね。でも、ポイント発行しちゃったんで、順番まちがえました。
さて、御回答いただいた内容ちょっとじっくり考えてみたいと思います。
それからまたレスさせていただきたいとおもいます。
投稿日時 - 2001-11-18 17:30:08
  • 回答No.2
レベル12

ベストアンサー率 45% (210/459)

こんにちは。itohhといいます。 fatal_errorさんありがとうございます。 わたしも解決したのか気になっていました。 cinを使うと言うことは標準入力から(DOS窓でキー入力など)から読み込むと 解釈してお答えしました。 質問者のyabuchanchanさんにお聞きしたいのですが、 A.ファイルを指定して読み込みたい。 B.標準入力から読み込みたい。 もし、Aなら ...続きを読む
こんにちは。itohhといいます。

fatal_errorさんありがとうございます。
わたしも解決したのか気になっていました。

cinを使うと言うことは標準入力から(DOS窓でキー入力など)から読み込むと
解釈してお答えしました。

質問者のyabuchanchanさんにお聞きしたいのですが、
A.ファイルを指定して読み込みたい。
B.標準入力から読み込みたい。

もし、Aならfatal_errorさんが回答しているような方法もアリだと思います。
でも、わたしなら、2バイト(2文字?って2バイトのことですよね。)づつ読み込まないで
まとめて読み込みます。CFileクラスやCStdioFileクラスなどを使用します。
なぜなら、その都度ファイルのアクセスするのはレスポンスが悪くなるからです。
補足コメント
yabuchanchan

お礼率 60% (108/179)

お返事ありがとうございます。標準入力から読み込むときとファイル指定する場合とではどのように違うんですか?
投稿日時 - 2001-11-20 17:36:11
お礼コメント
yabuchanchan

お礼率 60% (108/179)

お返事、ありがとうございました。
とりあえず、以下のように書くと実行できました。
#include<iostream.h>
int main()
{
char pch[100];
cout<<"Input!\n";
while(pch)
{
cin.read(pch,2);
cout<<pch<<'\n';
}
return 0;
}

でも、ある一定以上の文字をキーボードから入力すると実行できなくなってしまいます。
これはどうしてなんですか?比較的大量のデータを扱いたいんですが・・。
投稿日時 - 2001-11-20 19:52:01
  • 回答No.4
レベル8

ベストアンサー率 39% (23/58)

横槍気味の回答になりますが。 >if(pch=='gc') これは、"string.h"のstrcomp関数を使います。 この場合なら、 if((strcomp(pch,"gc"))==0) です。 この関数は文字列を比較する関数で、二つの文字列が一緒なら0を返します。 >一文字のときは大丈夫なのになぜ二文字だとだめなんで ...続きを読む
横槍気味の回答になりますが。

>if(pch=='gc')
これは、"string.h"のstrcomp関数を使います。
この場合なら、
if((strcomp(pch,"gc"))==0)
です。
この関数は文字列を比較する関数で、二つの文字列が一緒なら0を返します。

>一文字のときは大丈夫なのになぜ二文字だとだめなんですか?
一文字(半角の)なら、単純にASCIIコードの数値で比較すればオッケーですが、
二文字以上になると数値でってわけに行かなくなるからです。
それから「'(シングルクォート)」は、一文字のコードを表すものです。
例えば'A'はASCIIコードなら65と書いたのと同じことになります。
この場合の「二文字以上がまずい」のはそのせいでもあります。
お礼コメント
yabuchanchan

お礼率 60% (108/179)

非常にわかりやすい御回答ありがとうございました、
お二人には今回非常に有益な回答をしてもらって感謝いたしております。
また、わからないことがあったらここに質問したいと思います。
それにしても、プログラムは奥がふかいですね。
もっと、勉強していきたいです。
投稿日時 - 2001-11-22 17:54:56
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ