1

これが、リストを作成する関数と一緒に私のコードの編集されたバージョンです。start はグローバル変数として初期化され、start=NULL です。fwriteも変えました。変数の長いリストを列挙するのではなく、buf を使用してその内容 (名前、タイトル、タイプなど) を取得しました。mygets は、後に続く \n を削除するために作成した単なる関数です。同じ問題が発生します。外国のシンボルが出てきます。

void saving()
    {
            FILE *out;
            struct node buf;
            struct node *current;

            out = fopen("foo", "wb");
            if(out == NULL) return;

            printf("Writing to file...");

            while(current != NULL)
            {

                   fwrite(&buf, sizeof(struct node), 1, out);
            }

            printf("Done!\n");
            fclose(out);
    }



void create()
{
node *p,*q;
int item;
char ti[STRLEN],na[STRLEN],ty[6];

printf("Warrior name: ");
mygets(na);

printf("\nWarrior title: ");
mygets(ti);

printf("\nWarrior Type and Class Encoding: ");
fgets(ty,6,stdin);

p=(node *)malloc(sizeof(node));

strcpy(p->name,na);
strcpy(p->title,ti);
strcpy(p->type,ty);

p->next=NULL;
if(start==NULL)
{
start=p;
}
else
{
q=start;
while(q->next!=NULL)
{
q=q->next;
}
q->next=p;
}       

}

4

3 に答える 3

2

Baldrickがコメントで指摘したように、リンクされたリストの開始/ヘッド ノードに割り当てられていませんcurrent

初期化されていないポインターを逆参照する方法は、プログラムのクラッシュにつながる可能性がありますが、幸いなことに、そうではありません。

使用する:

struct node *current = head;    // Or whatever is your head node name

ちなみに、バイナリ ファイルを作成する場合は、foo.txtという名前を付けずに、 .bin.datなどのバイナリ拡張子を使用するか、拡張子を使用しない方がよいでしょう。

于 2013-10-14T08:26:21.877 に答える
0

リンクされたリストをファイルに正常に保存するには、最初のノード(ヘッド ノード) から開始し、最後のノードまでさらにノードに移動し続ける必要があります。コードで *current を Head ノードに初期化しませんでした。

ヘッド ノードのアドレスをパラメータとしてSaving()関数に渡す必要があります。これを使用して電流を初期化できます。

Saving()関数を呼び出すときに、ヘッド ノードを渡すことができます

void main()
{   
    //other code...

    saving(Head); //while calling the saving() method just pass the head node as parameter

   //remaining code... 
}

*current がヘッド ノード(最初のノード)に初期化されるように

ボイド保存(構造体ノード*現在){ファイル*アウト;

       out = fopen("foo.txt", "wb");
        if(out == NULL) return;

        printf("Writing to file...");

        while(current != NULL)
        {
                    fwrite (current->name, sizeof current->name, 1, out);
                fwrite (current->title, sizeof current->title, 1, out);
                fwrite (current->type, sizeof current->type, 1, out);
                current = current->next;
        }

        printf("Done!\n");
        fclose(out);
}
于 2013-10-14T08:58:37.653 に答える