2011-12-17 6 views
1

私はそれがバイナリだと、私の構造体からfwriteのFUNCでそれを書くというのが私のファイルを一覧表示する機能書いた:なぜfseekが機能しないのですか?

void ReadFile::printList(){ 
clearerr(bookFilePtr); 
fseek(bookFilePtr,0L,SEEK_SET); // set to begin of file 
int counter = 1; 
cout << "***************************************************" << endl; 
struct book tmp ; 
while (!feof(bookFilePtr)){ 
      fread(bookPtrObj,sizeof(struct book),1,bookFilePtr); 
    cout << bookPtrObj->name << "s1"<< endl; 
    cout << bookPtrObj->publisher << "s2"<< endl; 
    cout << bookPtrObj->author << "s3" <<endl; 
    cout << bookPtrObj->stock << endl; 
    cout << bookPtrObj->translation << endl; 
    cout << bookPtrObj->trasnlator << "s4" <<endl; 
    cout << bookPtrObj->delayDays << endl; 
    cout << bookPtrObj->delayPay << endl; 
    cout << "***************************************************" << endl; 
    fseek(bookFilePtr,counter * sizeof(struct book) ,SEEK_SET); // seek to next data 
    counter ++; 
} 

をかつてはすべての私のファイルのために印刷しますが、私のループからやめませんでした。私のfuncは最後のデータをfile.Howで印刷し続け、私のfuncを終了してファイルの終わりまで調べるのですか? fseekは機能しますか?

+0

なぜあなたは迷惑をかけていますか? 'sizeof(struct book)'バイトでファイルポインタをすでに移動しています。とにかく、それぞれの呼び出しで 'fread'の結果を実際に調べるべきですが、それは別の問題です。 –

答えて

3

while(!feof(bookFilePtr))は、読み取りループを実行するための悪い方法です。 !feof(...)は、フリーダが成功することを保証しません。 をループさせ、freadの代わりにループする必要があります。

while(fread(bookPtrObj, sizeof(struct book), 1, bookFilePtr) == 1) { 
    // blah blah do the things 
} 

fseekの呼び出しがあまりにも冗長である:freadは、既にファイルにカーソル自体を進め、あなたが追求する必要はありません。

1

while (!feof(f))という意味ではありません。 「現在の位置がファイルの終わりにある」という意味ではなく、「最後にファイルの最後を読み取ろうとしました」という意味です:freadなどで設定され、fseekなどでクリアされたフラグです。 freadには戻り値があります。その戻り値は、読み込みが成功したかどうかを示します。これをループ条件として使用します。

fseekの戻り値も無視していますが、これは同じ理由で悪いですが、少なくとも直接的には問題の原因ではありません。

私はこれがちょうどfseekの実験コードであると仮定していますが、ループ内のfseekは位置がすでにあるはずの位置に設定されているため、値は追加されません。