2011-12-23 41 views
-1

我有一個從二叉樹寫入東西的函數。當我運行它時,它只是在txt中寫入樹的根。有人能告訴我這裏有什麼問題嗎?預先寫入一個txt文件中的二叉樹

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

爲什麼每個函數調用都打開一個文件描述符?爲什麼不通過這個流派作爲一個論點? – fge 2011-12-23 17:47:46

+0

爲什麼你打開它,即使'p'爲'NULL'? – fge 2011-12-23 17:48:29

+0

我試圖做到這一點,但我無法做到。所以這樣我就問這裏:\任何想法請你?因爲該功能總是打開和關閉文件:\ – 2011-12-23 17:51:11

回答

3

如果你真的必須在每次調用wrte()時間打開該文件,我會改變的代碼再次遞歸調用write之前關閉當前流:

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

然而,一個更好的設計是是一個ostream傳遞到您的wrte()功能:

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 +或一個+或其他東西? – 2011-12-23 18:44:24

+0

哎呀,我的壞。這應該是通過參考。即'void tree :: wrte(ostream&out,person * p)'在示例中已修復。 – 2011-12-23 19:04:47

+0

謝謝。它現在完美:) – 2011-12-23 19:34:08