2017-09-29 14 views
1

私は、ファイルから情報を読み込んで構造体に格納するコードに取り組んでいます。それは私がそれ以外の多くの異なったエラーでそれを投げるすべてのファイルに作用しています。 ファイルにエラーがあると、それに続く行がスキップされてしまい、その理由がわかりません。私のコードは以下の通りです:ファイル内の行をスキップするfin.ignore()?

void readFile(char fileName[], accessRecord file[]) 
{ 
    ifstream fin(fileName); 
    int i = 0; 
    while (fin.good()) 
    { 
    fin >> file[i].fileName >> file[i].userName 
     >> file[i].timeStamp; 
    i++; 

    if (fin.fail()) 
    { 
     fin.clear(); 
     fin.ignore(256, '\n'); 
    } 
    } 
fin.close(); 
} 

これは問題を引き起こしているFileです。

+0

'timestamp'を読むとき、改行を使い、" schedule.docx "を消費しようとしています。あなたが無視を実行すると、 "schedule.docx"行の終わりまで無視されます... – scohe001

+1

Sorta Duplicate:[行ごとにファイルを読む](https://stackoverflow.com/questions/7868936/read-ファイル行ごとに)。アンサー1オプション2を使用すると、クリアしたり無視したりするときに遭遇する問題のほとんどが排除されます。また、配列の代わりに 'std :: vector'を使用できるかどうかを確認してください。できない場合は、関数からiを返すことを強くお勧めします。何行目に読み込まれたか知っていて、推測によって未定義の動作を誘惑する必要はありません。 – user4581301

+0

これは問題ではありませんが、最後にファイルを閉じる必要はありません。デストラクタはそれを行います。 –

答えて

0

問題は、失敗したときに改行コードを消費しないということです。

行全体を文字列として解析して検証しないのはなぜですか?そうすれば、検証が失敗した場合、次の行に安全に移動します。

#include <sstream> 
#include <string> 

std::string line; 
while (std::getline(infile, line)) 
{ 
    std::istringstream iss(line); 
    if (!(iss >> file[i].fileName >> file[i].userName >> file[i].timeStamp)) { 
     // Error. go to the next line here 
     continue; 
    } 
    // process your data 
} 

PS:Read file line by lineからインスピレーションを受けています。さらに、普通のCスタイルの配列にstd::vectorを使用しないのはなぜですか?それについて考える!

+1

それは私がやろうとしていたものよりずっと簡単でした。ありがとう! – Kirby

関連する問題