2010-08-21 186 views
1

我遇到了来自fstream的getline指令的问题。 这是从我的代码片段:getline返回空字符串

 

boolean_1=true; 
while(true) 
{ 
    if(boolean_1) 
    { 
     //some stuff 
    } 
    else 
    { 
     save_file.open("save.txt", fstream::in); 
     //some stuff 
     save_file.close(); 
    } 

    mission_file.open(filename, fstream::in); 
    mission_file.getline(buffer_line, 256); 

    //some other stuff 

    boolean_1=false; 
    save_file.open("save.txt", fstream::out); 
    //write something 
    save_file.close();  
} 
 

此代码应打开mission_file它运行的第一次,并且在下次迭代打开保存文件。保存文件在每个周期结束时创建。 至少它应该像这样工作。 因为,第一次完美地工作,但在下一次迭代中,“mission_file.getline(buffer_line,256);”返回一个空行,导致程序崩溃。 另外,如果boolean_1以false开始,则循环将正常工作,直到下一个循环为止。

我已经检查过需要的“.txt”的存在,mission_file和save_file都返回is_open()true。

+0

您似乎没有检查'getline'是否成功,可能是您想在到达最后一行后停止? – 2010-08-21 09:12:07

+0

'getline'只有在我已经加载了一个mission_file时才会失败,完成所有的任务,然后在下一个周期开始时重新打开它。它不会失败,当我第一次打开它时,我从这段代码中省略了在EOF之前停止的代码。 – Tibor 2010-08-21 09:26:00

+0

如果您的代码示例是完整且可编译的(尽管最小),它将有很大帮助。现在我们可以看到你有一个名为'mission_file'的变量,但是你没有显示它声明的位置或方式,或者你执行的所有相关操作。 – 2010-08-21 09:30:55

回答

2

从代码提取中看不到您已发布的代码,但听起来您正在为每个循环重新使用相同的std::fstream对象。

在你需要重新打开文件的地方,在循环内创建一个新的本地对象会更清楚。

如果您必须重新使用相同的fstream对象来打开一个新文件(或另一次同一文件),您必须确保在从新文件读取之前清除任何流错误标志。

在第一次从新文件读取之前的某个时刻执行clear应该这样做。

mission_file.clear() 
+0

非常感谢,.clear()解决了一切:)! – Tibor 2010-08-21 12:13:12

0

您是否确定mission_file正在关闭,因为我没有看到mission_file.close()。或者是你错过了将这一行放在代码片段中。

+0

不好意思,我忘了将这个mission_file.close()放在代码片段中,无论如何它都在代码中。 – Tibor 2010-08-21 09:16:11