0

リンクされたリストの内容を保存するプログラムを作成しようとしています (個々のリストはローカリティと呼ばれ、データ型の組み合わせが含まれています)。コードはコンパイルされますが、予期せず終了します。それはifstreamライブラリの行を私に紹介します(私は書き込みを使いたいだけですが)

*_Str = _Elem();    // add terminating null character

誰かが何がうまくいかなかったのか考えていますか?

   //saves a single locality onto a file
    void fSave_locality(Clinked *current, fstream *fout)
    {
        fout->write(current->site_name,100);
        fout->write((char*) &current->cood_x,sizeof(double));
        fout->write((char*) &current->cood_y,sizeof(double)); 
        fout->write((char *) &current->dip,sizeof(double)); 
        fout->write((char *) &current->strike,sizeof(double)); 

        if (current->next!=NULL) fSave_locality(current->next,fout);
    }

    void fSave_list(char* fname)
    {
        fstream *fout;
        do
        {
            cout<<"Would you like to save as a (b)inary or (t)ext file? ";
            test = getch();
            cout<<"Enter file name (make sure its unique!): ";
            cin.getline(fname,100);

            if(toupper(test)=='T') fout->open(fname, fstream::out);
            if(toupper(test)=='B') fout->open(fname, fstream::out| fstream::binary);
        }
        while(toupper(test)!='T' || toupper(test)!='B');

        if(fout->fail())
        {
            cout<<"unable to open file.\n";
            exit(0);
        } //it gets to here without any problems. 

        current = start;
        while(current->next!=NULL)
            {
                fSave_locality(current, fout);
                current=current->next; //repeat for the next object in the list
            }
        fout->close();
    }
4

1 に答える 1

0

同時に再帰的かつ順次に反復している理由がわかりませんか? どちらかを選択してください。コードを変更しました。また、while ループに正しい制限を設定し、null オブジェクトを使用せず、null オブジェクトの要素にアクセスしようとする必要があります。

  void fSave_locality(Clinked *current, fstream *fout)
    {
        fout->write(current->site_name,100);
        fout->write((char*) &current->cood_x,sizeof(double));
        fout->write((char*) &current->cood_y,sizeof(double)); 
        fout->write((char *) &current->dip,sizeof(double)); 
        fout->write((char *) &current->strike,sizeof(double)); 

        //if (current->next!=NULL) fSave_locality(current->next,fout); // comment this out
    }

以下の部分を変更します。

while(current!=NULL)
    {
        fSave_locality(current, fout);  // you should either comment this one or the recursive one
        current=current->next; //repeat for the next object in the list
    }
于 2012-12-11T23:59:15.127 に答える