2011-12-23 21 views
-1

私はバイナリツリーから物事を書き込む関数を持っています。私がそれを実行すると、ツリーのルートがtxtに書き込まれます。誰かが私に何が間違っているか教えてくれる?あなたは本当にあなたがwrte()を呼び出すたびにファイルを開く必要がある場合はバイナリツリーをtxtファイルに書き込むpreorderly

void tree::wrte(person *p) 
{ 
    ofstream out("myfile.txt"); 

    struct register{ 
     char ID[15];  
     char name[30];  
     char surname[30];  
    };        

    register reg; 
    if(!(mybook=fopen("myfile.txt","a+"))) 
    {       
     if (!(mybook=fopen("myfile.txt","w+"))) 
     {            
      cerr<<"Couldnt opened"<<endl;return;     
     }                 
    }           
    if(p)     
    {        
     strcpy(reg.name,p->name);    
     strcpy(reg.ID,p->ID);       
     strcpy(reg.surname,p->surname);       
     out << reg.ID <<'\t'<<reg.name<<'\t'<<reg.surname<<'\t'<<endl; 
     wrte(p->left);               
     wrte(p->right);                 
    }                      
    out.close();     
} 
+1

なぜ関数呼び出しごとに1つのファイルディスクリプタを開くのですか? ofstreamを議論として渡すのはなぜですか? – fge

+0

なぜ、 'p'が' NULL'であってもそれを開きますか? – fge

+0

私はそれをやろうとしましたが、私はできませんでした。だからthatsの方法私はここで尋ねる:任意のアイデアpls?関数は常にファイルを開き、閉じます。\ –

答えて

3

、私は再帰的に再書き込みを呼び出す前に、現在のストリームをクローズするためにコードを変更したい:

if(p) 
{ 
    ... 
    out << reg.ID <<'\t'<<reg.name<<'\t'<<reg.surname<<'\t'<<endl; 
    out.close(); 
    wrte(p->left); 
    wrte(p->right); 
    ... 

しかし、より良いデザインが希望あなたのwrte()関数にostreamを渡すこと:

void tree::wrte(ostream& out, person *p){ 
    ... 
    if(p) 
    { 
     ... 
     out << reg.ID <<'\t'<<reg.name<<'\t'<<reg.surname<<'\t'<<endl; 
     wrte(out, p->left); 
     wrte(out, p->right); 
    } 
    ... 
} 

その後のあなたの最初の呼び出しの前に出力ストリームを開きます:

int main() 
{ 
    ... 
    ofstream out("myfile.txt"); 

    ... 
    tree_ptr->wrte(out, p); 
    out.close(); 
    ... 
} 
+0

私はあなたが言ったことをしましたが、それはまだ仕事をしません。エラーメッセージは次のようになります: 'ios_base.h | 790 | error: 'std :: ios_base :: ios_base(const std :: ios_base&)'はプライベートです|'私は、 'int counter'?だから、私はw +または+または何か別のファイルを開く必要があるかどうかを確認することができますか? –

+0

おっと、悪いです。それは参考にして渡す必要があります。 'void tree :: wrte(ostream&out、person * p)'この例では固定です。ありがとうございます。 –

+0

それは今完璧に動作します:) –

関連する問題