2011-12-24 3 views
0

私は構造体をバイナリファイルに書き込んでそこから読み込む必要があるというプログラムを書いた。 私はfread、fwrite、fopen、fseek、およびfcloseを使用します。 ファイル内のすべてのレコードを出力する次の関数を記述しました。fopenとディスクとの同期

void ReadFile::printList(){ 
// clearerr(bookFilePtr); 

    fseek(bookFilePtr,0L,SEEK_SET); // set to begin of file 

    int counter = 1; 
    long int line = 1; 
    int pageCounter = 1; 

    while (this->readFromFile() == 1){ 
     string output; 
     mvprintw(++line, 27,"***Title*****************Value*********"); 
     output = "Name:    " + bookPtrObj->name; 
     mvprintw(++line, 27, output.data()); 
     output = "Publisher:   " + bookPtrObj->publisher; 
     mvprintw(++line, 27,output.data()); 
     output = "Author:    " + bookPtrObj->author; 
     mvprintw(++line, 27,output.data()); 
     output = "Translator:   " + bookPtrObj->translator; 
     if (bookPtrObj->translation == true) 
      mvprintw(++line, 27,output.data()); 
     if (bookPtrObj->stock != true) 
      mvprintw(++line, 27,"Stock:    The given book doesn't exist."); 
     else 
      mvprintw(++line, 27,"Stock:    The given book exist."); 
     if (pageCounter % 3 == 0){ 
      mvprintw(++line, 27,"Press any key to see next page..."); 
      getch(); 
      clear(); 
      line = 1; 

     } 
     pageCounter++; 
     refresh(); 
     fseek(bookFilePtr, counter * sizeof(struct book) ,SEEK_SET); // seek to next data 
     counter ++; 
    } 
// fflush(bookFilePtr); 

    menu(); 
} 

注:私は最初、データエントリのために実行し、私はプログラムを終了するときpage.Butすることは非常に素晴らしく、ページFUNC上から自分のデータを見ることができます、すべてが私は二度目の実行broken.Whenされています、上記の関数を実行すると、私はセグメンテーションフォールトを得る、それは私の構造体のポインタであるbookPtrObjをトレースし、私のfile.Iを読み取ることができませんfopen、[rb。 wb、ab +、rb +、a +、w +、aw +]などがある。私は結果を得ていませんでした。私は、ファイル内の私のデータ滞在するにはどうすればよい

fseek(bookFilePtr,0L,SEEK_END); 
fwrite(ptr,sizeof(struct book),1,bookFilePtr); 

: は、私はもちろん、私は、構造体の要素を満たした後、2次の行を実行し、次の行のファイルに書き込みますか?

答えて

2

あなたはたくさんのコードを提供していませんが、文字列自体ではなく、文字列自体へのポインタを保存するか、それとも悪いですか? - std::stringオブジェクトの内容です。代わりに適切にシリアル化する必要があります。

+0

あなたの推測が真実なら、最初の実行のためにデータ入力ができますか?正しく読む? – PersianGulf

+0

データを書き込んだ同じ時に正しく読むことができますか? –

+0

ファイルは一連のバイトです。ファイルにデータを書き込むには、データを表す一連のバイトに変換する必要があります。それを読み返すときは、ファイルに書き込んだ一連のバイトの形式から、それを操作するために必要な形式に変換する必要があります。あなたはそれらの事のどちらもしません。あなたは* fwrite(ptr、sizeof(struct book)、1、bookFilePtr); 'これを行うことはできません。あなたはファイルがあるはずのフォーマットに変換する必要があります。 –

0

ファイルにデータを書き込んだり、ファイルからデータを読み込もうとする前に、ファイル内のデータの形式を指定する必要があります。あなたがやっていることは、未知のフォーマットの任意のバイトのデータをファイルに書き出すことです。それが実際に働くならば、それは幸運だけです。

ファイルに整数などを格納する場合は、固定長か可変長のどちらを使用するかを決定する必要があります。変数の場合、読者はバイト数をどのように決定するでしょうか?最上位の数字/ビットが最初に来るのか、それとも最も重要でないのでしょうか?あなたはテキストかバイナリでそれを書くでしょうか?

次に、データがファイルが持つはずのバイトに変換するコードを記述する必要があります。そしてそれらを読んだら、あなたのプログラムがそれらを操作するために使用したいタイプに変換する必要があります。

経験がない場合は、おそらくテキストが最適です。このようにして、ファイルをビューアやエディタで簡単に見ることができます。

あなたはこれを行うことはできません。

fwrite(ptr,sizeof(struct book),1,bookFilePtr); 

は、あなただけのファイルに任意のバイトを書いています。はい、現在の実行コンテキストでは意味がありますが、別の実行コンテキストでは意味をなさないかもしれません。ファイルへの書き込みに適した、明確に定義された自己完結型のデータ形式に変換する必要があります。ここで

は愚かな例の方法です:

const char *foo="foo"; 
fwrite(&foo, sizeof(&foo), 1, filePtr); 

これは値"foo"を持つ文字列へのポインタである、fooの内容を書き込みます。しかし、あなたがそれを読んだとき、もはや存在しなくなったアドレス空間へのポインタを読み返します。あなたはどんな感覚でそれを作れますか?あなたのアドレス空間で意味のあるものを指すことはあまりありません。

+0

'fwrite(&foo、sizeof(foo)、1、filePtr);を意味します。 ( '&'ビット)。 –

+0

Ack、そうです。私はそれを "修正"しましたが、それは私の例をひどい例にしています。 –

+0

私は 'sizeof(&foo)'をするべきではないと思います。あなたは 'foo'変数のサイズを必要とします。しかし、それは*ポインタなので、同じです。だから、うまく、それは "作品" :) –