getlineについて

このQ&Aのポイント
  • C++のgetlineを使用したプログラムで、80文字の制限をなくす方法を教えてください。
  • プログラム中で標準入力から各行を80文字だけ読み込み出力する際に、80文字制限をなくす方法について教えてください。
  • getlineを使用するプログラム中の80文字制限をなくす方法についてご教示ください。
回答を見る
  • ベストアンサー

getlineについて

現在getlineを用いてプログラムを作成しようとしているのですが、例えば #include <iostream> using std::cin; using std::cout; using std::endl; int main(){ char buffer[81]; while(!cin.eof()){ cin.getline(buffer,sizeof(buffer)); cout << buffer << endl; while((!cin.eof())&&cin.fail()){ cin.clear(); cin.ignore(80,'\n'); } } return 0; } というプログラムを作った場合、標準入力から各行を80文字だけ読み込み出力をするわけなんですが、 この80文字という文字制限をなくしたい場合どういった工夫をすればいいのでしょうか?

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

まず、どんな感じの工夫をしてみましたか?修正されたソースを提示してください。 基本はほとんど書いたままなのですが、もう少しだけ説明を追記しておきます。 # 工夫の仕方を質問されてるのに、ソースをそのまま載せるのは好ましくないと考えますのであえて載せません。ご了承ください。 # FAQに近いので、どうしてもということであればGoogleで"getline(cin, buffer)"と検索するだけでも色々説明が出てきますし。 > char buffer[81]; こうかいてしまうと、当然一度に読み込めるのはこの80文字以下になる。 80文字ずつの分割読み出しは面倒。 std::stringは文字列長が可変なので、まずbufferをcharにするのはやめて、std::stringにする。 > std::string buffer; > cin.getline(buffer,sizeof(buffer)); ここでsizeof(buffer)とやっているが、これはcharの場合には81になり、制限になっている。 また、cin.getlineはstd::stringを取るようになってないので、これを使うと文字数制限が消えない。 で、getlineには、cin(が所属するstd::istream)のメンバとしてのstd::istream::getlineと、そうでないstd::getlineというものが用意されている。 今回、読み出し数制限を緩和するためにはstd::getlineを使うので、呼び出し方を変えなければならない。 > getline(cin, buffer); ってことです。 ちなみに、この場合でもstd::string::max_size()以上の入力とかしようとすると標準例外が発生する可能性はありますが、 通常は数万とか数十万文字とか(コンパイラ次第)入りますので、 入門レベルではまだ気にする必要がないかもしれません。 # 実務なら例外対策は重要ですけれど。興味があればtryやcatchの仕方等を調べてみてください。

enigma2005
質問者

お礼

詳しい回答ありがとうございます。 工夫した点に関しては、初めNULLを使って何とかならないものかと色々やってみましたが、この説明を見て自分のやってる行為が恥ずかしくなってきました。 tryやcatchに関してもちょっと勉強して見たいと思います。 どうもありがとうございました。

その他の回答 (1)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

bufferをstd::stringに変えて、 getlineをメンバでないstd::getlineに変える。 std::string buffer; getline(cin, buffer);

enigma2005
質問者

補足

回答ありがとうございます。 すみませんがもう少し詳しく書いてくれるとありがたいです。 上のプログラムも参考書片手に、見よう見まねで書いたものなので。 申し訳ないです。

関連するQ&A

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • 質問です。。。

    いつもすみません。また質問させていただきます。 まずしたのプログラムを見てください・・・ #include <iostream> #include <string> using namespace std; int main() { string name; int tosi; cout << "こんにちは。私はコンピュータです。" <<endl; cout << "あなたの年齢を教えてください" <<endl; cin >> tosi; cout<<name<<"歳なんですか・・・老けてますね(笑)"<<endl; cout << "どこの学校ですか" <<endl; cin >> name; cout<<name<<"That's right!"<<endl; } このプログラムの8行目にあるint tosi;がありますよね。 この単語がなくても string name があったら12行目のプログラムができたのですが、どういうことなのでしょうか? 表現が一部変ですがよろしくお願いします。

  • javaプログラミング

    以下のプログラムがコンバイルできません なぜでしょうか? #include<iostream> #include<cmath> using namespace std; int main() { double a, b; cout << "実数 a の値を入力してください " << endl; cin >> a; cout << "実数 b の値を入力してください " << endl; cin >> b; cout << a << " の " << b << " 乗は " << pow(a, b) << "です" << endl; return 0; }

    • ベストアンサー
    • Java
  • プログラムの動作の仕方

    この下のプログラムは、WRITE <ファイル名>をコマンド行で入力すると、動作するプログラムなのですが、この通りにWRITE <test>としてもできません。 やり方を教えてください. #include <iostream> #include <fstream> using namespace std; int main(int argc,char *argv[]) { if(argc!=2){ cout << "使い方:WRITE<ファイル名>" << endl; return 1; } ofstream out(argv[1]); //出力ファイル if(!out){ cout << "出力ファイルが開けません" << endl; return 1; } char str[80]; cout << "文字列をディスクに書き込み、$で停止します" << endl; do{ cout << ": "; cin >> str; out << str << endl; }while(*str!='$'); out.close(); return 0; } お願いします。

  • C++の問題の問題なんですが

    a = 3+aを代入演算子を用いて表現せよ。ってどうすればいいんですか? a+=3;ですか? 以下のように出力されるプログラムを作成せよ 年齢を入力してください 16 生まれた年を入力してください 1986 好きな数字を入力してください 7 あなたは1986年生まれの16才で、7が好きですね #include <iostream> using namespace std; int main(){ cout << "年齢を入力してください\n" << 16 << endl; cout << "生まれた年を入力してください\n" << 1986 << endl; cout << "好きな数字を入力してください\n" << 7 << endl; cout << "あなたは1986年生まれの16才で、7が好きですね" << endl; return0; } 上の問題にcinを一度だけ使って表現せよ 1番最初のプログラムはこうでいいのかなと思うんですが、次のcinを一度だけ使って表現せよって言うのが分かりません。実行結果も含めて教えてもらえませんか?

  • 改行文字について

    #include<iostream> using namespace std; int main(void) { char c; while (cin.get(c)) if (c == '\n') cout << "[RET]\n"; else cout << c; return(0); } これのif (c == '\n')の改行文字と等しいとは何のことを指すのでしょうか? よろしくお願いします。

  • プログラムの動作

    10文字をスキップするプログラムなのですが、どのようにスキップしているのかわからないので教えてください。 下にソースコードを書きます。 #include <iostream> using namespace std; //10文字をスキップする istream &skipchar(istream &stream) { int i; char c; for(i=0; i<10; i++)stream >> c; return stream; } int main() { char str[80]; cout << "いくつかの文字を入力する:"; cin >> skipchar >> str; cout << str << endl; return 0; } よろしくおねがいします。

  • あっているか教えてください。

    #include <iostream> int main() { int i1, k1, k2; std::cin >> k1 >> k2; while (k1 > 0 || k2 > 0) { for (i1 = 0; i1 < k1; i1++) std::cout << "A"; for (i1 = 0; i1 < k2; i1++) std::cout << "B"; std::cout << std::endl; std::cin >> k1 >> k2; } return 0; } このプログラムで下記のような問題 図形の出力 [問題]いくつかの整数データの組が入力されるものとする.各組のデータは,それぞれ,1行に出力する文字数を表しており,最初のデータは文字 G の出力数,また,次のデータは文字 A の出力数を表しているものとする.データを読み込み,指定された出力を行うプログラムを書け.なお,データは,「0 0」を入力することによって終了するものとする がじっこうできるでしょうか。.

  • Sortプログラムについて

    自分で作成したプログラムなのですが、ソートしたあと、出力ファイルに書き込みたいのですが、書き込めません。 どこが、悪いのかわからないので教えてください。 ところどころに、出力がありますが、それはトレースしたやつなので、それはほっといてくださって構いません。 下にプログラムを載せます。 よろしくお願いします。 #include <iostream> #include <fstream> #include <list> #include <string> using namespace std; int main() { char Str[255]; list<string> str; ifstream in("ttest", ios::binary | ios::in); if (!in){ cout << "入力ファイルが読み込めない" << endl; exit(1); } ofstream out("out", ios::binary | ios::out); if (!out){ cout << "出力ファイルが読み込めない" << endl; exit(1); } while (!in.eof()){ //!!!! in.getline(Str,255); str.push_back(Str); } str.sort(); list<string>::iterator p; p = str.begin(); while (!in.eof()){ cout << *p; out << *p++; } in.close(); out.close(); getchar(); return 0; }

  • 修正箇所の指摘のお願い(文字列の書き出し)

    C++についての質問です。 あるテキストファイルを読み込み、行頭の空白文字(スペース)を 削除して、別のテキストファイルへ書き出すプログラムを 作成しています。 下記のようにコーディングを行いましたが、 読み込みファイルの1行目が書き出されず、最終行が2回 書き出される状態となってしまいました。 お手数ですが、修正箇所を教えて頂けないでしょうか。 ************************************************************ #include <iostream> #include <string> #include <fstream> using namespace std; #define INPUT_FILE "C:\\input.txt" #define OUTPUT_FILE "C:\\output.txt" int main() { ifstream fin(INPUT_FILE); ofstream fout(OUTPUT_FILE); char str[255]; if(!fin) { cout << "入力ファイルを開けません\n"; return 1; } if(!fout) { cout << "出力ファイルを作成できません\n"; return 1; } fin.getline(str,254); while(!fin.eof()) { std::cin.setf( std::ios::skipws ); // スペースの読み飛ばし fin >> str; fout << str << std::endl; } fin.close(); fout.close(); return 0; } ************************************************************ よろしくお願いします。

専門家に質問してみよう