2013-08-23 19 views
0

我試圖定義這個內聯函數。它會創建一個決策樹(在操作研究中使用的特定二叉樹)。fstream不會寫在文件上,直到endl

這是代碼:

inline void printTreeFile(int* i_node,int* j_node,int* q_infr,int* value,int nStart,int level,std::fstream& tree) 
{  int spazi=0,len,stop; 
     for(int actual_level=0;actual_level<level;actual_level++) 
      {spazi+=9; 
      if(i_node[actual_level]==0) 
       len=1; 
      else 
       len=(int)log10(i_node[actual_level])+1; 
      spazi+=len; 
      if(j_node[actual_level]==0) 
       len=1; 
      else 
       len=(int)log10(j_node[actual_level])+1; 
      spazi+=len; 
      if(q_infr[actual_level]==0) 
       len=1; 
      else 
       len=(int)log10(q_infr[actual_level])+1; 
      spazi+=len; 
      } 
     if(value[level]==0) 
      { 
      tree<<"-->("<<i_node[level]<<","<<j_node[level]<<","<<q_infr[level]<<"=1)"; 
      tree<<endl; 
      for(int i=0;i<spazi;i++) 
       tree<<" "; 
      tree<<"-->("<<i_node[level]<<","<<j_node[level]<<","<<q_infr[level]<<"=0)"; 
      } 
     else 
      tree<<"-->("<<i_node[level]<<","<<j_node[level]<<","<<q_infr[level]<<"=1)"; 
     //cin>>stop; 
} 

std::fstream& tree在主定義爲:

fstream tree;      
remove("tree"); 
tree.open("tree",ios::out|ios::app); 

我不明白,爲什麼在執行命令tree<<endl;

直到文件 tree是空的

我需要看看這棵樹如何在不等待這個命令的情況下自我演化......任何人都知道這個問題的解決方案? 感謝所有會回答!

+2

流有一個緩衝區。你必須調用flush()來強制執行寫操作。 std :: endl添加一個'\ n'並調用flush()。 –

回答

0

endl輸出一個換行符並強制緩衝區刷新,這就是爲什麼你在那時看到它。

文件流,除非你修改它們的屬性,完全緩衝,所以你不會看到任何東西,直到緩衝區已滿或你明確地刷新它。

這可以通過endl(假設您想要首先發送換行符),通過ostream::flush或關閉文件時完成。

也許最簡單的解決方法是改變你的if語句轉換成類似:

if (value[level] == 0) { 
    tree << "-->(" << i_node[level] << "," << j_node[level] << "," << q_infr[level] << "=1)\n"; 
    for (int i = 0; i < spazi; i++) 
     tree << " "; 
    tree << "-->(" << i_node[level] << "," << j_node[level] << "," << q_infr[level] << "=0)"; 
} else { 
    tree << "-->(" << i_node[level] << "," << j_node[level] << "," << q_infr[level] << "=1)"; 
} 
tree.flush(); 

事實上,由於其中一些線路的共性,我會考慮它重構,使其更可讀:

inline void outLine (
    std::fstream& tree, 
    int   *inode, 
    int   *jnode, 
    int   *qinfr, 
    int   level, 
    int   val) 
{ 
    tree << "-->(" << i_node[level] << "," << j_node[level] 
     << "," << q_infr[level] << '=' << val << ')'; 
} 

: 

if (value[level] == 0) { 
    outLine (tree, i_node, j_node, q_infr, level, 1); 
    tree << '\n'; 
    for (int i = 0; i < spazi; i++) 
     tree << " "; 
    outLine (tree, i_node, j_node, q_infr, level, 0); 
} else { 
    outLine (tree, i_node, j_node, q_infr, level, 1); 
} 
tree.flush(); 

牢記原因爲什麼文件會同時標準輸出完全緩衝是行緩衝的。大多數文件你不關心,直到工作完成緩衝完全是更有效的。 這種情況在情況下顯然不是這種情況,但是通常比所需的頻繁刷新通常會減慢代碼的速度。

如您所說,這只是調試代碼,您可以忽略重構或過度刷新時的速度損失。

+0

我試圖在文件中打印這棵樹的原因是爲了簡單的調試!當我希望這段代碼運行得很快時,我不會使用這個函數;) – TwistAndShutter

+0

沒有probs,@LovaJ。,我的其他建議(在重構時)也被你的評論渲染了。我會留下它,但有可能是沒有必要的。 – paxdiablo