プロが教える店舗&オフィスのセキュリティ対策術

C++でテキストファイルを読み込む処理に行き詰ってます。
for( ; msgfile.eof() == 0; )
{
  msgfile.get(str, strlen(header)+1 );
  // 行の最初の8文字を取り出す (A)

if( strcmp(str, header ) != 0 ) {
    // 先頭8文字がheaderと一致しないと
     // その行は読み飛ばす

if (msgfile.getline(str, 256)) {
  //空行でない場合は(A)に、戻る
}
else {
  msgfile.get(); //空行の場合、永遠に当該行をリードしてしまう
     //空行の場合も(A)に戻るようにしたい
   }
}
   else
   //先頭8文字がheaderと一致した場合の処理
}

上記のmsgfile.get();で、msgfileの空行を永遠にリードし続けます。
msgfileの次の行をリードする処理はどのようにすればよろしいのでしょうか。
(forループを抜けたいわけではありません)

質問者からの補足コメント

  • 早速のレスポンスありがとうございます。msgfileはifstream型です。この型のファイルの空行をスキップする方法を知りたいです。ちなみにignoreは試したのですがうまくいきませんでした。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/04/12 09:21

A 回答 (4件)

ifstreamって、一度failbitとかが立つと、clearするまで読み込みできなくなるみたいですね。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。調べてみるとmsgfile.getでは改行のみの行でfailbitがたつようですが、msgfile.getlineでは改行のみ行でも改行コードを読み込んで次の行に進みました。よって次のように修正したら、うまくいきました。
ifstream::pos_type pos;
for( ; msgfile.eof() == 0; )
{
pos = msgfile.tellg(); // 位置を保存
msgfile.getline(str, 256))
if(strncmp(str, header, strlen(header)) != 0){
//何もせずに次の行へ
} else {
msgfile.seekg(pos);//ファイルポインタを戻す
msgfile.get(str,strlen(header)+1);//最初の8文字取得
    //以降、他処理を行う
}
}
failbitを意識して調べたらわかりました。

お礼日時:2016/04/14 01:18

そういう仕様ですね>#3. 規格にも「いったん立った failbit を落としてから読み込む」コード片が書かれてますし.



さておき, ちょっとファイルの仕様がどうなっているのかも気になった. 例えば header が "ABCDEFGH" のとき
AAAAAAAsomething wrong
(※ここは空行です)
ABCDEFGHthis is good
(以下省略)
みたいなフォーマットになっているのでしょうか? そして, このようなフォーマットで「空行を永遠にリードし続け」るということでしょうか? もしこういうフォーマットだとしたら
AAAAAAAAsomething wrong
(※ここは空行です)
(※ここも空行です)
ABCDEFGHthis is good
とか
AAAAAAAAsomething wrong
ABCDEFGHthis is good
の場合, あるいは
AAAAAAAAここはとっても長い行なんだと思ってください具体的には300バイトくらいの長さになってる行だったりするといろいろプログラムに問題があって困りそうなんだよねそろそろ300バイトは越えてくれるかなもうちょっとあった方がいいかなああもういい加減面倒だからこれで止めることにしておくけどこれで足りなかったらもっと長くしてくれ
(※ここは空行です)
ABCDEFGHthis is good
だったらどうすればいいんだろうか.
    • good
    • 0

試してないけど ignore でいけるように思えるんだが.... ignore を試したときにはどう書いてどう「うまくいかなかった」んでしょうか?



あ, このプログラムの構造はなんかおかしい気がする. msgfile.getline(str, 256) に失敗したら無限ループにならないかな.
    • good
    • 0
この回答へのお礼

Msgfile.getlineのかわりに、msgfile.ignore()にしていましたが、ファイルの早速の空行を永遠に読み込み続ける無限ループになりました。

お礼日時:2016/04/12 13:41

まず確認したいのだが msgfile の型はどうなっている?

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています