データをバイナリファイルに正しく正しくする方法を理解しようとしています。データは書き込まれていますが、テストのために読み戻されたときに、正しく書き込まれていないことは明らかです。データは次のように読み書きされます。
Unsigned Charは、次の文字列の長さを示し、次に文字列が書き込まれ、次に整数IDが書き込まれます。(または長さstudentname student_id)。以下は、データをファイルに保存するprintList関数です。
void printList(struct node * nptr, string filename){
ofstream myfile;
myfile.open( filename.c_str(), ios::binary );
while(nptr){
myfile.write( (char*) &nptr->data.len, sizeof( unsigned char ) );
myfile.write( (char*) nptr->data.name, len * sizeof(char) );
myfile.write( (char*) &nptr->data.id, sizeof(int) );
//myfile.write( (const char*) &nptr->data, sizeof( Student ) );
nptr = nptr->next;
}
myfile.close();
}
データがリンクリストに保存される学生の構造体は次のとおりです。
struct node{
Student data;
struct node* next;
};
//=== Student struct===//
struct Student{
unsigned char len;
char* name;
int id;
};
//====================//
これが私がバイナリを読み戻すために書いたloadbinファイルです。これもまた何かを台無しにしていて、これに関するたくさんのチュートリアルを読んで見ました。私は本当に困惑しています。
unsigned char len;
char* name;
int id;
int main( int argc, char* argv[] )
{
if( argc > 1 )
{
ifstream f( argv[1] , ios::binary);
while( !f.eof() )
{
f.read( (char*) &len , sizeof( unsigned char ) );
if( f.eof() )
break;
name = new char[len+1];
name[len+1] = '\0';
f.read( (char*) name , len * sizeof( char ) );
f.read( (char*) &id , sizeof( int ) );
cout << (int)len << " " << name << " " << id
<< "\n";
}
}
else
cout << "\nToo few arguments.\n";
}
さらに詳しい情報ですが、ファイルの読み込み方法を変更することはできません。修正は、書き込み時に行う必要があります。それが役立つ場合に備えて、それを含めました。