
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ループを抜けたいわけではありません)
No.3ベストアンサー
- 回答日時:
ifstreamって、一度failbitとかが立つと、clearするまで読み込みできなくなるみたいですね。
ご回答ありがとうございました。調べてみると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を意識して調べたらわかりました。
No.4
- 回答日時:
そういう仕様ですね>#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
だったらどうすればいいんだろうか.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB 電卓 メモリー機能
-
PIC mainループについて
-
win10で、正確な待ち時間の作り方
-
関数呼び出しの処理
-
C言語 再帰処理のメリットとデ...
-
DoEvents関数って何?
-
「単体テスト」に関する深刻な...
-
VBでの簡易電卓の作成(減算方...
-
Excel VBAにて、2GB超の点群デ...
-
Excelでのセル内容の高速消去方法
-
VC++2010 GDIオブジェクトの解...
-
C#で書かれたプログラムをバッ...
-
VB.NETにおける二値化処理の高速化
-
WindowsMessage(ウィンドウメッ...
-
逆ポーランド記法における単項...
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
TCP/IP通信時のサーバーからの受信
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAにて、2GB超の点群デ...
-
小数点を含む数値かどうか判断...
-
プログラム上のCPU稼働率低減に...
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
SQLの速度をあげるには・・・
-
win10で、正確な待ち時間の作り方
-
If Not c Is Nothing Then ~延...
-
絶対パスの取得について
-
VC++2010 GDIオブジェクトの解...
-
ノットイコールを教えて下さい
-
C言語:関数を使うメリットとデ...
-
あっち向いてホイのプログラム...
-
再帰呼び出しを使いますか?
-
Excel VBA データ削除の高速化
-
C#で書かれたプログラムをバッ...
-
c言語で自然数nを入力、2以上n...
-
異なるプログラミング言語を連...
-
Excel VBA での処理時間計測結...
-
再帰呼出について
おすすめ情報
早速のレスポンスありがとうございます。msgfileはifstream型です。この型のファイルの空行をスキップする方法を知りたいです。ちなみにignoreは試したのですがうまくいきませんでした。