запись двоичного дерева в текстовый файл предварительно - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть функция, которая пишет вещи из двоичного дерева. Когда я запускаю его, он просто записывает корень дерева в текстовом формате. может кто-нибудь сказать мне, что здесь не так?

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 Ответ

3 голосов
/ 23 декабря 2011

Если вам действительно нужно открывать файл каждый раз, когда вы вызываете 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);
    }
    ...
}

Затем откройте поток вывода перед вашим первым вызовом wrte():

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

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