• ベストアンサー

Getlineについて・・・・・・

string temp; ifstream f(test.txt); while(getline(f, temp)){ (省略) } こんなかんじで、入力ファイルから1行づつ読み込んでいくのですが、もし、tempに改行のみが入った場合、(例えば入力ファイル test.txt に1行目、2行目は文があるが、3行目は改行で、4行目からまた文があり、読み込みたいのは、2行目までといった場合) 即while文から抜けるというふうにしたいのですがどうすればいいでしょうか? 詳しい方お願いします。

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

  • ベストアンサー
  • KoHal
  • ベストアンサー率60% (110/181)
回答No.2

while( getline(f, temp) && !temp.empty() ){ (省略) } その1. getlineは改行文字は読み込まないので空行ならtempは文字数=0になる。 その2. getline(f,temp)がfalseなら!temp.empty()は評価されない。 おまけ。 basic_stringに読み込むgetline()はれっきとしたC++標準ライブラリの関数です。

chihiro5203
質問者

お礼

ありがとうございました。自分の思っていた通りに実行できました。ありがとうございました。

その他の回答 (1)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.1

…getlineってC++? open watcomのライブラリ調べたけどないような… さて 1行ずつ読めるんですね? で、改行は0x0a(lf)/0x0d(cr)/0x0d+0x0a(cr+lf)のどれかですよね? while(getline.... { int brkflg=0; // 終了フラグ switch(temp[0]) { case 0x0d: case 0x0a: //空行なので、抜ける brkflg=1; break; } if(brkflg) break; // 行単位の処理... } //読み込めなかった or 空行が来たので抜けてきたはず ということじゃないのかなあ。

chihiro5203
質問者

お礼

無事解決しました。ありがとうございました。

chihiro5203
質問者

補足

ありがとうございます。早速参考にしてやってみたのですがうまくいきませんでした。 >…getlineってC++? C++のはずです。私が読んでいる参考書(明らかに初心者用)によると、 getline(ファイル, String変数); とすることで、ファイルから、1行String変数に読み込むというものらしいです。getlineは、ファイルの終わりに来て読み込むべきものがなくなると、実質0やfalseと同じような「失敗の合図」を返すそうです。 ちなみに、こんな言い方でいいのかわかりませんが、includeファイルはiostreamです。 実際に質問のときの例で最後まで、実行し、画面に出力すると、 1行目の文******** 2行目の文******** 3行目 改行 4行目の文******** こんな感じになります。

関連するQ&A

  • 【c++】文字列の操作

    お世話になります。 テキストの操作について質問があります。 getline関数を使用してテキストの1行分を読み込み その文字列をstrtok関数を使用し区切り文字ごとに配列に入れたいと考えています。 ですがgetlineはstd::string型の変数が必要でstrtok関数はchar型しか受け付けないため 関数同士で型が合わず困っています。 何とか型を合わせる方法は無いでしょうか。 以下にソースコードを記載しますのでご指導お願いします。 int main(){ using namespace std; string strText; char chArray[100]; ifstream fs("test.txt"); //パスで指定されたファイルから1行分の文字列を取得する while( getline(fs , strText , '\n') ){ //区切りごと配列に入れたい chArray = strtok(strText , ","); } }

  • Perl 先頭行に追加

    恐れ入ります。 Perlで、配列がカンマで区切られたデータを読み込み、 その先頭行にデータを挿入したいのですが、 中々うまくいきません。 データ(/data/xxx.txt)の中身は、 test,test2 bbb,bbb2 ccc,ccc2 という感じで、カンマで区切られて改行で並んでいます。 そこに新たに$dateと$contで受けたデータを先頭行に追加する感じです。 open(FILE,"<./data/xxx.txt"); while($temp = <FILE>){ @temp=split(/,/,$temp); push(@ddr,"$temp[0]","$temp[1]"); } seek(@ddr,0,0); unshift(@ddr,($date,$cont."\n")); open(FILE,">./data/xxx.txt"); $new=join(",",@ddr); print FILE $new; close(FILE); このように書いていますが、 print FILE @ddr とすると、配列が壊れた状態(全て繋がる)で先頭行には挿入されたのですが、カンマで区切って配列にして並べようとしたら、 test,test2 ,bbb,bbb2, ,,ccc,ccc2,, という感じで上手く並びません。 よろしくおねがいします。

    • ベストアンサー
    • Perl
  • 大きな2つのファイルから共通するデータを抜き出す方法を教えてください。

    2つのテキストファイルから共通する行を高速に抜き出す方法に困っています。 fileA.txtには 139 36.1 139.01 36.1 139.02 36.1 という感じで1万行ぐらいあり、 fileB.txtには 138.8 36.3 0.01 138.81 36.3 NaN 138.82 36.3 0.01 という感じで100万行ぐらいあります。 fileAと1、2欄目が共通する行をfileBから抽出しようと思って以下のawkのスクリプトを書きましたが、処理に異様に時間がかかってしまいました(5時間かけてたった300行ぐらいしか処理できない!)。 もっと高速に処理するための方法をぜひ教えてください。 BEGIN{FS="\t" while(getline <"fileA.txt" > 0) form[++n]=$1":"$2 } {for(i=1;i<=n;i++){ temp=form[i] if($1":"$2 == temp){print $0} } }

  • バッチでテキストを出力したときに改行ができない

    バッチファイルでテキストを出力するのですが、改行ができません echo 一行目 > C:\temp.txt ? echo 二行目 >> C:\temp.txt として結果C:\temp.txtファイル内に  一行目  二行目 ではなく  一行目  二行目 としたいのですが、、 ?にはいるものがわかりません。 echo " " >> C:\temp.txt としても""が入ってしまうし echo   >> C:\temp.txt (全角スペース)を入れても"ECHO は <ON> です。"とメッセージが出てしまいます。 わかる方お願い致します。

  • CでCSVファイルを扱う

    いつもお世話になっております。 今回はCSVファイルの扱いについてお聞きしたいです。 現在、 "hoge","hogehoge","…","…" というようなCSVファイルを扱いたいと思い、いろいろ試しているのですがなかなかうまくいきません。 CSVの各行をgetlineで取得して、カンマで分けるだけならできたのですが、","のまとまりで分けたいのです。現在は文字で分割はできるのですが文字列で分割する方法がわかりません。 ","で分けたい理由はたとえば"hoge,hoge"という文字列をカンマで分けてしまうと二つに分かれてしまいそれを避けたいです。 分割点の前後の文字から判断しようともしてみましたがうまくいきませんでした。 アドバイスなどありましたらご教授願います。 現在は以下のようになっております。 ifstream ifs; string temp; LPCTSTR str; ifs.open("test.csv", ios::in); while(getline(ifs, temp)) {  str = strtok(const_cast<char*>(temp.c_str()), _T(",")); printf("%s\n", str);  while(str != NULL)  {   str = strtok(NULL, ",");   if (str != NULL)   {    printf("%s\n", str);   }  } } 以上のもので CSVの"1","2","3","4" が"1"と"2"と"3"と"4"になります。 これを1と2と3と4にしたいです。 よろしくお願いします。 環境はWindowsXP VisualStudio6.0 MFC未使用 です。お願いします。

  • C言語 ファイル入出力について

    test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいのですがどうもうまくいきません。色々ネットで探したりしたのですがstrlenをうまく使うのかな~ぐらいしか見当はつきません・・・。 何かよいアドバイスをお願いします!m(_ _)m 例 test.txt --------------------------------- 私の一番好きな食べ物はリンゴです。 --------------------------------- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ test1.txt ---------------------------------- 私の一番好きな 食べ物はリンゴ です。 ----------------------------------

  • ファイル内の文字列を検索して該当行を置換するには?

    C++にて"test.txt"内を検索して"No=00000"という行を"No=12345"に書き換えてファイルを上書き、 という処理をするプログラムを作成したいのですが、どのようにファイルへ書き込みをすればよいのか が分かりません"No=00000"の行を置換するまではできたのですが、置換した文字列で元の文字列を上書きするには どうすれば良いのでしょうか? それとも以下のソースでは根本的に考え方が違うのでしょうか?初歩的な質問で恐縮ですが、よろしく お願い致します。 *************************************** //test.cpp #include <string> #include <fstream.h> void main() { fstream fs; char buf[512]; fs.open("test.txt",ios::in | ios::out); while(!fs.eof()) { fs.getline(buf,sizeof(buf)); if(strstr(buf, "No=")) { std::string aa; aa=buf; aa.replace(3,5,"12345"); //ここからの処理が分かりません・・・ } } } ************************** test.txtは以下の通り Name=test No=00000 ←この行だけ書き換えたい。 Address=hoge

  • ifstreamクラスとistreamクラス

    こんにちは。 C++について質問させて下さい。 コンパイラは、Borland C++ Compiler 5.5 を使用しています。 僕は、ifstreamとfstreamクラスは、istreamクラスから派生していると認識しています。 つまり、istream型のポインタや参照は、ifstream型オブジェクトもfstream型オブジェクトも指す事ができるはずです。 その事を確認するために、まず、以下のような内容の入力マニピュレータを作成しました。 ------------------------------------------------------------ istream &alphabet(istream &stream) { char ch; do{ ch=stream.peek(); if(!isalpha(ch)) stream.get(ch); }while(!isalpha(ch) && !stream.eof() ); return stream; } ------------------------------------------------------------ この入力マニピュレータは、 ifstream fin("test.txt"); のようにして作成されたifstream型オブジェクトのfinと、 char str[80]; のようにして作成された文字列変数strに対して、 fin >> alphabet >> str; のように使うと、finに結び付けられたファイルtest.txtの現在位置(getポインタの位置)から、 次にアルファベットが現れるまで、アルファベット以外の文字を捨て去ることで、 アルファベットではじまる単語をstrに格納する事ができます。 また、この入力マニピュレータは、istream型オブジェクトへの参照を受け取るので、 fstream finout("test.txt"); のようにして作成されたfstream型オブジェクトのfinoutに対して、 fin >> alphabet >> str; のように使っても、問題なく動作しました。 つまり、上のマニピュレータの場合は、istream型オブジェクトへの参照を、 引数として受け取るようにしてあるので、istreamクラスから派生している、 ifstreamクラスのオブジェクトや、fstreamクラスのオブジェクトを渡す事ができています。 次に、以下のような内容の、ifstream型オブジェクトへの参照を受け取る関数を作成しました。 void file_to_str(ifstream &file, char *str) { const int size=1000; char temp[size]=""; do{ file.getline(temp, size); strcat(str, temp); if(!file.eof()) strcat(str, "\n"); }while(!file.eof()); } この関数は、 ifstream fin("test.txt"); のようにして作成されたifstream型オブジェクトのfinと、 char str[1000]; のようにして作成された文字列変数strに対して、 file_to_str(fin, str); のように使うと、finに結び付けられたファイルtest.txtの内容を、 文字列変数strに格納する事ができます。 ここで、上の関数のプロトタイプを void file_to_str(ifstream &file, char *str); から void file_to_str(istream &file, char *str); に変更してみると、プログラムをコンパイルした時に、以下のようなエラーが発生します。 ------------------------------------------------------------ C:\Users\kei\work\C++ >bcc32 file_to_str.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland file_to_str.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'file_to_str(std::basic_fstream<char, std::char_traits<char> >&, char *)' が未解決(C:\USERS\KEI\WORK\C++\FILE_TO_STR.OBJ が参照) ------------------------------------------------------------ file_to_str.cppには、上の関数が定義されていて、 そのmain関数の内容は、以下の通りです。 ------------------------------------------------------------ void main(void){ ifstream fin("test.txt"); char str[1000]; file_to_str(fin, str); } ------------------------------------------------------------ コンパイルエラーは、 file_to_str(fin, str); の行で発生しています。 なぜ、入力マニピュレータの時は、仮引数をistream型オブジェクトへの参照にしてもOKだったのに、 関数の場合はコンパイルエラーが発生するのかが分からず、困っています。 理屈的には、何度も言っているように、istreamクラスからfstreamクラスとifstreamクラスが派生しているので、全然問題が無いように思えます。 何か御存じの方がいらっしゃれば、是非、情報を提供して頂きたく思います。 では、よろしくお願い致します。

  • fstream型オブジェクトを関数の仮引数にする

    こんにちは。 現在、C++を使ってプログラミングをしているのですが、fstream型・ifstream型・ofstream型のオブジェクトを、関数の仮引数にするにはどうすればよいのか分からず困っています。 具体的に言いますと、まず、main関数の中で fstream file("test.txt"); のように、fstream型オブジェクトfileを定義しておき、これを以下のような関数に渡して、関数の内部で使いたいのです。 (以下の関数は、ファイルの内容を、1つの文字列変数に格納するためのものです。) ________________________________________________________________________________________________________________________ void file_to_str(fstream file, char *str){ const int size=10000; str=""; //初期化しとかないとダメ。 char temp[size]=""; //初期化しとかないとダメ。 while(!file.eof()){ file.getline(temp, size); //改行に出会うかsize個の文字を読み込むまで、 //文字をバtemp)に読み込む。 strcat(str, temp); if(!file.eof()){ strcat(str, "\n"); //getline()関数は改行をバッファに読み込まない。 } } } ________________________________________________________________________________________________________________________ この関数を、main関数でfstream file("test.txt"); と記述した直後で呼び出した所、以下のようなエラーが出ました。 ________________________________________________________________________________________________________________________ エラー E2247 file_to_str.cpp 48: 'ios::basic_ios(const ios &)' はアクセスできな い(関数 fstream::basic_fstream(fstream &) ) エラー E2247 file_to_str.cpp 48: 'ios::basic_ios(const ios &)' はアクセスできな い(関数 iostream::basic_iostream(iostream &) ) エラー E2125 file_to_str.cpp 48: コンパイラは 'copy constructor' クラスの istrea m を作成できない(関数 iostream::basic_iostream(iostream &) ) エラー E2125 file_to_str.cpp 48: コンパイラは 'copy constructor' クラスの ostrea m を作成できない(関数 iostream::basic_iostream(iostream &) ) ________________________________________________________________________________________________________________________ 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。 (「このプログラムの場合は、FILE型ポインタで代用できる。」といった答え以外でお願い致します。) では、よろしくお願い致します。

  • ifstream/ofstream について

    こんにちは。 よろしくお願いいたします。 ifstream で定義したファイルを open し、一端 close した後再度 open しようとすると、エラーとなります。 何が原因かわかりますでしょうか? ちなみに、インファイル.txt は何も記載していないので、下記ソースのwhileループ内には入りません。 が、whileループが有ればエラー(メッセージ:3103)が発生し、 無ければ、エラーは発生しません。 環境:XP home & ボーランドC++Builder6.0 テストしたソース: void __fastcall TForm1::Button6Click(TObject *Sender) { ifstream InFile; ofstream OutFile; char cBuf[255]; InFile.open("インファイル.txt"); if (!InFile) ShowMessage("3101"); OutFile.open("アウトファイル.txt"); if (!OutFile) ShowMessage("3002"); while (!InFile.getline(cBuf, sizeof(cBuf)).eof()) { OutFile << cBuf << endl; } // このwhileループが無ければ、エラーは発生しません。 OutFile.close(); InFile.close(); InFile.open("インファイル.txt"); if (!InFile) ShowMessage("3103"); // ここでメッセージが出力されます。 }

専門家に質問してみよう