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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- 教育ソフト・学習ソフト vbsで分割した値をそれぞれの変数に 1 2022/10/17 19:52
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(プログラミング・Web制作) プログラミング python pandas 固定長データの出力 2 2022/08/16 11:22
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- その他(言語学・言語) フォントで記号が読めない 1 2022/03/23 23:24
- 確定申告 e-TAXで確定申告をしています。 ふるさと納税の金額を寄付先から交付されたデータを読み込ませて対応 3 2023/02/23 08:05
- Visual Basic(VBA) 1つの入力フォルダの値を読み込み、3分割をして新しい変数に代入する方法を教えていただきたいです。 読 4 2022/10/17 20:52
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
*をユーザーが入力した数字の数...
-
Linuxで入力待ちなしkeyread関...
-
数字以外が入力されたらエラー...
-
java初心者です。入力されたの...
-
double型が正常に認識されてい...
-
scanfが2回使えない・・・?;
-
batプログラム上で文字列を入力...
-
C言語 for文をつかって記号を表...
-
C言語scanf_sで何故か2回入力に...
-
プログラミング初心者です。 Py...
-
至急お願いします。プログラミ...
-
Eclipseコンソール表示を、リセ...
-
VB.NETで16進数+16進数や16進...
-
C言語でのカレンダー作成
-
c言語の数当てゲームプログラム...
-
C言語 逆ピラミッドの作り方
-
java 入力された文字列を数値に...
-
"scanf"でエンターで改行させな...
-
Excel VBAで、Application.Inpu...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
double型が正常に認識されてい...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
C言語について。
-
batプログラム上で文字列を入力...
-
*をユーザーが入力した数字の数...
-
cout関数を使っているのですが...
-
漢字のソートについて
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
ワードで文字を入力する時の変...
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
EDITコントロールで入力できる...
-
Eclipseコンソール表示を、リセ...
-
小数か整数かを判定する方法
-
C言語scanf_sで何故か2回入力に...
-
VB.NETで16進数+16進数や16進...
-
Linuxプログラミングで、キーボ...
おすすめ情報