2015-10-15 30 views
0

EDIT 1線少在Linux:問題解決了。 @sth問我是否忘記刪除可能用「new」創建的對象。他是對的!我忘了它。並修復這確實解決了這個問題。我想這是Visual Studio爲我做的事,而Linux不是。相同的代碼來編寫的陣列,以一個文件寫入相對於Windows

編輯2:由於這是一個學校項目和潛在的抄襲問題,即使我自己編寫代碼,代碼也被刪除。此外,這個問題似乎與我的代碼的細節無關,並且更多的是新的和刪除的一般C++用例。

完全相同的代碼具有不同的行爲上的Visual Studio 2013(安裝在Windows上)和我的學校,我用G ++編譯代碼的SSH服務器。代碼編譯沒有錯誤,並按照預期工作,除了1部分。將數組的內容逐行寫入文件時,它會少寫1行。

如果陣列有10種元素的Visual Studio編譯的代碼創建「sorted.txt」文件具有10行和所有的人都保持完全1的整數。沒有空行。 Ssh編譯的代碼仍然會創建10行,但最後一行是空的。所以在我的「sorted.txt」文件中實際上有一個整數丟失。我的任務將在評分時在此服務器上編譯,因此這可能是一個問題。

+2

程序是否在沒有正確清理FileManager對象的情況下終止? – sth

+0

在Linux上運行valgrind。您可能會發現'FileManager'實例泄漏。 – timrau

+0

@sth我不確定我是否可以檢查。代碼執行時沒有錯誤,ssh終端只是要求我寫新的命令。它沒有給我任何信息。 – GoktugO

回答

1

std::ofstream是一個緩衝流。如果未正確關閉或刷新,某些緩衝數據可能不會寫入磁盤。

在你的情況下,只要包含FileManager被銷燬,std::ofstream就會被清除。這很可能不會發生。這可能是該FileManager被動態分配new和永遠不會與delete破壞,或者該程序異常終止,例如與C庫函數exit()

只有最後一行是由這個問題,因爲std::endl影響刷新流並強制以前的數據被寫入磁盤。

2

您的代碼包含避免在最後一行末尾寫入換行符的邏輯。這很愚蠢,而且感覺有點解釋。你需要換行符。

+0

我們給出了一個「data.txt」文件,其中包含隨機放置的整數。我想排序這些整數,並創建一個「sorted.txt」文件,其中包含排序的整數。原來的「data.txt」文件最後沒有行,所以我只是試圖模仿它,僅僅用於演示。最後一行是否有必要? – GoktugO

+0

他爲什麼需要換行符? – sth

+0

'std :: endl;'強制刷新流。 Alf,輸出流是否應該在其銷燬的時候關閉?假設該程序不會在出口處崩潰而且不會銷燬。可能是更深層次的問題。 – user4581301

1

當我第一次看到你的代碼,我認爲這是奇怪,你是基於流的布爾運算符關閉流。您可以閱讀關於bool操作員的作用Here。而且,如Here所述,即使流仍處於打開狀態,bool運算符也可以返回false。考慮關閉基於此條件的流:

if (output.is_open()) 

而不是

if (output) 
+0

調用'output.close()'是多餘的。 'std :: ofstream'的析構函數會處理這個問題。 –

+0

其實不需要。 fstream將關閉銷燬。 – user4581301

+0

好吧,我記得有一些這樣的問題,如果沒有調用stream.close(),那麼在當天回來。不知道它在發生什麼操作系統。這就是爲什麼我認爲OP也是這種情況。 –

相關問題