2010-08-21 189 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