
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
>
という結果になります。
最後に。
>標準入力から読み込むときとファイル指定する場合とではどのように違うんですか?
標準入力では、オープンすることはプログラムを実行した段階で自動的に行ってくれます。
しかし、ファイルから入力する場合は、プログラム内で明示的にファイルを指定してオープン
しなければ行けません。また、クローズも同様です。
この回答への補足
本当にくわしい御回答ありがとうございます。
結局、2バイトと考えて二文字読みとって行ってるということなんですよね?それでは、100文字ずつ読みとるならば
cin.getline(pch,100)としたらいいんですね!!解決しました。
ところで、図々しいようですが、もうひとつ・・・。
たとえば、二文字ずつ読みとっていって、それが特定の二文字、たとえば、
「gc」とかがでてきたら、それをカウントしていきたいんですけど、
そのときに、
if(pch=='gc')
count[1]++;
というふうにかくと、エラーになってしまいます。一文字のときは大丈夫なのになぜ二文字だとだめなんですか?
すいません。時間がありましたらで結構なんで、教えていただければうれしいです。
No.4
- 回答日時:
横槍気味の回答になりますが。
>if(pch=='gc')
これは、"string.h"のstrcomp関数を使います。
この場合なら、
if((strcomp(pch,"gc"))==0)
です。
この関数は文字列を比較する関数で、二つの文字列が一緒なら0を返します。
>一文字のときは大丈夫なのになぜ二文字だとだめなんですか?
一文字(半角の)なら、単純にASCIIコードの数値で比較すればオッケーですが、
二文字以上になると数値でってわけに行かなくなるからです。
それから「'(シングルクォート)」は、一文字のコードを表すものです。
例えば'A'はASCIIコードなら65と書いたのと同じことになります。
この場合の「二文字以上がまずい」のはそのせいでもあります。
非常にわかりやすい御回答ありがとうございました、
お二人には今回非常に有益な回答をしてもらって感謝いたしております。
また、わからないことがあったらここに質問したいと思います。
それにしても、プログラムは奥がふかいですね。
もっと、勉強していきたいです。
No.2
- 回答日時:
こんにちは。
itohhといいます。fatal_errorさんありがとうございます。
わたしも解決したのか気になっていました。
cinを使うと言うことは標準入力から(DOS窓でキー入力など)から読み込むと
解釈してお答えしました。
質問者のyabuchanchanさんにお聞きしたいのですが、
A.ファイルを指定して読み込みたい。
B.標準入力から読み込みたい。
もし、Aならfatal_errorさんが回答しているような方法もアリだと思います。
でも、わたしなら、2バイト(2文字?って2バイトのことですよね。)づつ読み込まないで
まとめて読み込みます。CFileクラスやCStdioFileクラスなどを使用します。
なぜなら、その都度ファイルのアクセスするのはレスポンスが悪くなるからです。
お返事、ありがとうございました。
とりあえず、以下のように書くと実行できました。
#include<iostream.h>
int main()
{
char pch[100];
cout<<"Input!\n";
while(pch)
{
cin.read(pch,2);
cout<<pch<<'\n';
}
return 0;
}
でも、ある一定以上の文字をキーボードから入力すると実行できなくなってしまいます。
これはどうしてなんですか?比較的大量のデータを扱いたいんですが・・。
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文で繰り返せば良いでしょう。
配列って何?とかいう場合は補足をどうぞ。
この回答への補足
レスありがとうございます。そうですね。まずitohhさんに対してするべきですね。でも、ポイント発行しちゃったんで、順番まちがえました。
さて、御回答いただいた内容ちょっとじっくり考えてみたいと思います。
それからまたレスさせていただきたいとおもいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
scanfの入力をgets関数で読み捨...
-
C言語 行列計算
-
C言語初心者です。ファイルの読...
-
電卓の小数点
-
c言語応用で血液型判定プログ...
-
コマンドプロンプトからのEOFの...
-
C言語について質問です。 0以下...
-
数字以外が入力されたらエラー...
-
アセンブラ言語CASLIIのプ...
-
Eclipseコンソール表示を、リセ...
-
VisualStudio2019のコードアナ...
-
Javaの質問です
-
プログラミングの問題です 「金...
-
Userformの入力順序をタブオー...
-
正負を反転させて出力するプロ...
-
C言語で作成したプログラムの...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
20'(角度)の計算がわかりま...
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
EDITコントロールで入力できる...
-
Excel VBAで、Application.Inpu...
-
4桁の数字以外を入力したらエラ...
-
Eclipseコンソール表示を、リセ...
-
入力値が1以下、かつ数字以外の...
-
電卓の小数点
-
コマンドプロンプトからのEOFの...
-
プログラミングの問題です 「金...
-
scanf が無視されます
-
漢字のソートについて
-
scanfが2回使えない・・・?;
-
C言語について
-
Userformの入力順序をタブオー...
-
WindowsでEOF
-
ワードで文字を入力する時の変...
おすすめ情報