-1

我有一个从二叉树写东西的函数。当我运行它时,它只是将树的根写入 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();                
}
4

1 回答 1

3

如果您确实必须在每次调用时打开文件wrte(),我会更改代码以在再次递归调用 write 之前关闭当前流:

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

但是,更好的设计是将 an 传递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);
    }
    ...
}

然后在第一次调用之前打开输出流wrte()

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

    ...
    tree_ptr->wrte(out, p);
    out.close();
    ...
}
于 2011-12-23T18:03:34.853 回答