2010-05-24 46 views
0

我有一個程序,它使用ofstream寫它的輸出。使用Visual Studio編譯時,在Windows上一切正常,但在使用GCC編譯時,它只在Linux上寫入空文件。Ofstream在linux上寫空文件

ofstream out(path_out_cstr, ofstream::out); 
if(out.bad()){ 
cout << "Could not write the file" << flush; 
} 
else{ 
cout << "writing"; 

out << "Content" << endl; 

if(out.fail()) cout << "writing failed"; 

out.flush(); 
out.close(); 
} 

正在寫入的目錄具有0777特權。

奇怪的是:什麼都沒有寫,但沒有錯誤報告。

gcc的--version是:(4.3.4 Gentoo的P1.0,餅10.1.5)4.3.4

我知道的代碼應該工作,所以我更喜歡找建議,可能是錯誤的,而不是直接的代碼修復。

編輯:fwrite似乎以完全相同的方式失敗(沒有寫入,沒有錯誤報告)。

編輯:我執行GCC和程序通過SSH在我的大學目錄,如果它可以有任何意義。我有足夠的許可來執行和寫入文件(ls。> out.txt工作正常),它只是我的程序有麻煩。

感謝您的幫助

+1

在FC12下使用g ++ 4.4.3 – nico 2010-05-24 09:42:17

+0

在Linux下你的程序的輸出是什麼(如在cout中)? – UncleZeiv 2010-05-24 09:46:01

+0

您是否檢查了目錄中的可用空間(df -h dirname)?我還會在* strace *下運行該程序,並查看系統調用失敗。 – bobah 2010-05-24 09:47:02

回答

7

工作對我來說,Ubuntu的G ++ - 4.1。
您是否試圖執行strace ./test並查看是否存在調用該文件的write()

+0

是的,寫入電話在那裏 – 2010-05-24 09:57:57

+0

寫入電話在那裏?那麼這與代碼無關。 :S 我猜'貓「東西」> test_file'的作品? – 2010-05-24 10:02:54

+1

哦,現在我看到在strace輸出中隱藏了「Disk quota exceeded」。感謝您的幫助,我不知道strace。 – 2010-05-24 10:09:19

0

對我的作品與G ++ 4.4.1

+0

gcc --version是: (Gentoo 4.3.4 p1.0,pie-10.1.5)4.3.4 我知道代碼應該工作,所以我更喜歡看對於建議,可能會出現錯誤,而不是直接進行代碼修復。 – 2010-05-24 09:40:35

+1

@commanderz:我懷疑這是一個代碼問題。你有沒有試圖改變輸出目錄? – nico 2010-05-24 09:44:56

+0

是的,我試過varoius目錄。 – 2010-05-24 09:58:45

1

如果正在創建文件,我可以看到知道它不寫的原因。

檢查path_out_cstr的值。在類Unix系統上,路徑使用正斜槓'/'而不是MS-DOS類型的反斜槓'\'分開,這可能解釋兩個操作系統之間的行爲差​​異。


更新

由於我們未能catchfailbit | badbit問題的時候,你不妨try異常處理方法......報告第一次失敗之後這個樣本將停止...

#include <fstream> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    const char* const path_out = argv[1]; 

    std::cerr.exceptions(std::cerr.goodbit); 

    std::ofstream the_file_stream; 
    the_file_stream.exceptions(the_file_stream.badbit | the_file_stream.failbit); 

    try 
    { 
     std::cerr << "Opening [" << path_out << "]" << std::endl; 
     the_file_stream.open(path_out); 

     std::cerr << "Writing" << std::endl; 
     the_file_stream << "Content" << std::endl; 

     std::cerr << "Flushing" << std::endl; 
     the_file_stream.flush(); 

     std::cerr << "Closing" << std::endl; 
     the_file_stream.close(); 
    } 
    catch (const std::ofstream::failure& e) 
    { 
     std::cerr << "Failure: " << e.what() << std::endl; 
    } 

    return 0; 
} 
+0

path_out_cstr是程序的命令行參數,所以它是我輸入的內容。另外,我猜如果路徑錯了,文件甚至不會被創建。 – 2010-05-24 09:56:24

+0

當然,你是對的。我提供了一些示例代碼,可能有助於在未來發現類似的錯誤。 – Johnsyweb 2010-05-24 11:22:50

2

最有可能的解決方案是,該文件未能在開由於名稱或路徑中的問題而導致的構造函數。如果該文件無法打開,failbit而非badbit位將被設置成測試爲,而不是使用bad()

ofstream out(path_out_cstr, ofstream::out); 
if(out.fail()){ 
    cout << "Could not write the file" << flush; 
... 

fail()檢查或者failbit或badbit設置而壞只檢查badbit 。順便說一句,我嘗試了你的例子,它沒有任何問題,所以我故意讓路徑不好 - 仍然沒有問題,但是當我更改爲fail()它拾起了壞道路。