私は構造体をバイナリファイルに書き込んでそこから読み込む必要があるというプログラムを書いた。 私は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次の行を実行し、次の行のファイルに書き込みますか?
あなたの推測が真実なら、最初の実行のためにデータ入力ができますか?正しく読む? – PersianGulf
データを書き込んだ同じ時に正しく読むことができますか? –
ファイルは一連のバイトです。ファイルにデータを書き込むには、データを表す一連のバイトに変換する必要があります。それを読み返すときは、ファイルに書き込んだ一連のバイトの形式から、それを操作するために必要な形式に変換する必要があります。あなたはそれらの事のどちらもしません。あなたは* fwrite(ptr、sizeof(struct book)、1、bookFilePtr); 'これを行うことはできません。あなたはファイルがあるはずのフォーマットに変換する必要があります。 –