【问题标题】:writing binary tree in a txt file preorderly在 txt 文件中按顺序写入二叉树
【发布时间】:2011-12-23 17:45:00
【问题描述】:

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

【问题讨论】:

  • 为什么每次函数调用都打开一个文件描述符?为什么不将 ofstream 作为参数传递?
  • 即使pNULL,你为什么还要打开它?
  • 我试图这样做,但我做不到。所以这就是我在这里问的方式:\有什么想法吗?因为函数总是打开和关闭文件:\
  • 请学习如何格式化您的代码!

标签: c++ recursion binary-tree out


【解决方案1】:

如果您确实必须在每次调用 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();
    ...
}

【讨论】:

  • 我按照你说的做了,但还是不行。错误消息是:ios_base.h|790|error: 'std::ios_base::ios_base(const std::ios_base&amp;)' is private| 我想问我不能使用像int counter 这样的控制变量来打开文件吗?所以,我可以看看我是否必须用 w+ 或 a+ 或其他东西打开文件?
  • 糟糕,我的错。那应该通过引用传递。即void tree::wrte(ostream&amp; out, person *p) 在示例中是固定的。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多