我一直在尝试在二进制文件和链表之间进行写入和读取。有人可以解释我做错了吗?
保存:
currentContact = firstContact;
while( currentContact != NULL )
{
fwrite (currentContact->firstName, sizeof currentContact->firstName, 1, myFile);
fwrite (currentContact->surname, sizeof currentContact->surname, 1, myFile);
fwrite (¤tContact->age, sizeof (int), 1, myFile);
fwrite (currentContact->telephone, sizeof currentContact->telephone, 1, myFile);
currentContact = currentContact->next;
}
负载:
fread( &numContacts, sizeof( int ), 1, myFile );
newContact = realloc( newContact, sizeof( struct Contact ) * 1 );
countFile = 1;
while (fread(newContact, sizeof( struct Contact ), 1, myFile))
{
fread(newContact->firstName, sizeof newContact->firstName, 1, myFile);
fread(newContact->surname, sizeof newContact->surname, 1, myFile);
fread((&newContact->age), sizeof (int), 1, myFile);
fread(newContact->telephone, sizeof newContact->telephone, 1, myFile);
if (countFile == 1)
{
firstContact = newContact;
newContact = NULL;
}
else
{
currentContact = firstContact;
count = 0;
while( count != countFile )
{
if( strcmp( newContact->surname, currentContact->surname ) < 0 )
{
newContact->next = currentContact->next;
currentContact->next = newContact;
}
currentContact = currentContact->next;
}
newContact = NULL;
}
countFile++;
}
fclose( myFile );
编辑:
在应用了一些更改之后,第二次解析在循环中仍然存在错误,它会再次发送文件...
newContact = realloc( newContact, sizeof( struct Contact ) * numContacts );
countFile = 1;
while (countFile != numContacts + 1)
{
fread(newContact, sizeof (struct Contact), 1, myFile);
if (countFile == 1)
{
firstContact = newContact;
newContact = NULL;
}
else
{
currentContact = firstContact;
count = 0;
while( count != countFile )
{
if( strcmp( newContact->surname, currentContact->surname ) < 0 )
{
newContact->next = currentContact->next;
currentContact->next = newContact;
}
currentContact = currentContact->next;
}
newContact = NULL;
}
countFile++;
}
答案 0 :(得分:1)
看起来一个问题是以下声明:
while (fread(newContact, sizeof( struct Contact ), 1, myFile))
上述语句试图将某些内容读入newContact
指向的内存中。根据数据的写入方式,可能不正确。并且基于循环内的下一个语句读取各个成员的事实,那么它是不正确的。因此,应该消除while循环中的fread
。
其他一些潜在问题:
next
指针应该在某个时刻初始化为NULL(realloc不会将内存清零)。firstContact
。此外,如果新元素大于所有现有元素,则不会将其添加到列表中。OP编辑后整个列表的分配是一个合理的想法。但是,有必要更新newContact以指向循环中每次迭代时的正确内存块。您可以保留一个单独的指针变量来维护该信息。另外,读取整个联系人的变化也需要反映在编写代码中。因此,写入和读取的数据量不太可能相同(例如,结构具有占用空间的下一个成员变量,并且不会反映在书面数据中。
答案 1 :(得分:0)
我认为您的问题已经存在
fwrite (currentContact->firstName
你需要做的是写整个结构而不是写每个成员
fwrite (currentContact, sizeof(type of currentContact),..
//或者调用任何ur结构。