1

バイナリファイルとリンクリストの間で書き込みと読み取りを試みてきました。誰かが私が間違っていることを説明できますか?

保存する:

currentContact = firstContact;


while( currentContact != NULL )
{
fwrite (currentContact->firstName, sizeof currentContact->firstName, 1, myFile);
fwrite (currentContact->surname, sizeof currentContact->surname, 1, myFile);
fwrite (&currentContact->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 );

編集:

いくつかの変更を適用した後でも、ループを介した2回目の解析でエラーが発生し、ファイルが再びフレッドされます...

                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++;                    
            }
4

2 に答える 2

1

1つの問題は次のステートメントのようです。

while (fread(newContact, sizeof( struct Contact ), 1, myFile))

上記のステートメントは、が指すメモリに何かを読み込もうとしていますnewContact。データの書き込み方法によっては、これ正しくない場合があります。そして、ループ内の次のステートメントが個々のメンバーを読み取るという事実に基づいて、それは正しくありません。そのfreadため、whileループ内はおそらく削除する必要があります。

その他の潜在的な問題:

  • コードはおそらく、新しい連絡先ごとにメモリを割り当てているはずです(最初の割り当てのように見えるのは単一の要素のみであるため)。
  • ポインタは、nextある時点でNULLに初期化する必要があります(reallocはメモリをゼロにしません)。
  • 新しい要素のリンクインにはいくつかの問題があるようです。たとえば、新しい要素が新しい最初の要素である場合、ヘッドポインタfirstContactを更新する必要があります。また、新しい要素が既存のすべての要素よりも大きい場合、その要素はリストに追加されません。
  • コードはfreadの結果をチェックする必要があります(エラー状態について)。

OP編集後 リスト全体を1つのピースに割り当てることは合理的な考えです。ただし、ループ内の各反復で正しいメモリを指すようにnewContactを更新する必要があります。その情報を維持するために、別個のポインター変数を保持することができます。さらに、連絡先全体を1つのピースで読み取るための変更は、書き込みコードにも反映される必要があります。現状では、書き込まれるデータと読み取られるデータの量が同じになる可能性は低くなります(たとえば、構造体には、スペースを占有し、書き込まれたデータに反映されない次のメンバー変数があります。

于 2013-01-04T20:27:33.887 に答える
0

私はあなたの問題はすでににあると思います

fwrite (currentContact->firstName

あなたがする必要があるのは、各メンバーを書くのではなく、構造全体を書くことです

fwrite (currentContact, sizeof(type of currentContact),..//または構造体が呼び出されるものは何でも。

于 2013-01-04T20:35:14.820 に答える