2009-10-16 97 views
2

我正在嘗試使用ofstream類將一些東西寫入文件,但所發生的只是文件被創建,然後什麼都沒有。我有一些簡單的代碼在這裏:爲什麼ofstream有時會創建文件但無法寫入文件?

#include <iostream> 
#include <fstream> 

#include <cstring> 
#include <cerrno> 

#include <time.h> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    ofstream file; 
    file.open("test.txt"); 
    if (!file) { 
     cout << strerror(errno) << endl; 
    } else { 
     cout << "All is well!" << endl; 
    } 

    for (int i = 0; i < 10; i++) { 
     file << i << "\t" << time(NULL) << endl; 
    } 

    file.flush(); 
    file.close(); 
    return 0; 
} 

當我創建一個控制檯應用程序,一切工作正常,所以我怕這個代碼是不能完全代表。但是,我在一個更大的項目中使用這樣的代碼 - 說實話 - 我不完全理解(Neurostim)。我應該編寫一些編譯成可以由Neurostim加載的dll的類。

當代碼運行時,會創建「test.txt」,然後「沒有錯誤!」被打印出來,因爲這顯然是來自strerror的輸出。顯然這是錯誤的。該應用程序運行完美否則,並沒有分階段的事實,我試圖寫入一個損壞的流。它只是不這樣做。在我看來,權限沒有問題,因爲該文件實際上已經創建。

有沒有人有任何想法什麼樣的事情可能會導致這種奇怪的行爲? (我在WinXP Pro SP3上並使用Visual C++ 2008 Express Edition)

謝謝!

+0

本質上,你發佈的代碼示例工作?老兄..請重複錯誤! – Jacob 2009-10-16 16:41:10

+0

我可以發佈整個項目,但我想你們不想爲我編寫數千行代碼。代碼示例是爲了說明發生了什麼以及應該發生什麼。部分問題正是因爲我不知道是什麼導致了這個錯誤,我不知道如何重現它。這就是爲什麼我要求可能導致這種行爲的事情。 – Jordi 2009-10-16 17:55:58

回答

4

只是一個想法: - 在你真正的代碼是您在流對象重新使用?

如果是這樣,則需要確保在重新使用該對象之前在流上調用clear(),否則,如果出現以前的錯誤狀態,則不起作用。我記得,在這樣的數據流上不會調用clear()會導致無法寫入的空文件,就像您在問題中所描述的那樣。

2
ofstream file; 
    file.open("test.txt"); 

只是一個尼特:你可以把它組合成一個單一的行。 ofstream file("test.txt");

if (file) { 
      cout << strerror(errno) << endl; 
    } else { 
      cout << "All is well!" << endl; 
    } 

你的測試是向後的。如果file是真的,它是開放的,並準備好寫作。

此外,我不會指望strerror()在Windows上正常工作。大多數Windows API不使用errno來指示錯誤。如果你的失敗發生在C/C++運行時庫之外,這可能不會告訴你任何有趣的事情。

+0

感謝您的意見。第一件事是故意的,因爲在真正的應用程序中'file'是一個類屬性,所以它已經在頭文件中聲明,我只能在以後打開某些東西。我修復了向後檢查,在我的真實代碼中它確實是正確的。我實際上不知道strerror()做了什麼,但是我在相關問題的某個地方看到了它(沒有解決方案),並且認爲我會用它來提供更多信息。 – Jordi 2009-10-16 17:52:00

+0

我想說你應該讓你的測試程序可靠地重現錯誤,然後再試一次。至於strerror(),這在Unixy系統中最爲常見,其中來自操作系統和RTL的*每個*錯誤都用errno表示。在Windows上,您希望查看諸如GetLastError()之類的內容。 – 2009-10-16 18:06:05

0

UPDATE更多地考慮這一點,未能通過fstreams打開一個文件並不保證設置errno。有可能errno最終在某些平臺上設置(特別是如果這些平臺使用FILE*或文件描述符或其他某些設置爲errno的庫執行fstream操作),但不能保證。檢查失敗的官方方法是通過​​,std::io_statestd::fstream(如failbad)的幫助方法。不幸的是,您無法從errno中獲得儘可能多的信息,std::streams

你有if語句錯誤。如果該文件不可寫,則返回operator void*返回NULL(又名false)。如果文件是可寫的,則它返回非零(又名true)。所以,你想:

if (!file) { 
     cout << strerror(errno) << endl; 
} else { 
     cout << "All is well!" << endl; 
} 

或者:

if (!file.good()) { 
     cout << strerror(errno) << endl; 
} else { 
     cout << "All is well!" << endl; 
} 
+0

是的,謝謝你,我在我的問題中反思了它,但不是在我的實際代碼中。我現在修好了,但問題依然存在。 – Jordi 2009-10-16 17:52:55

相關問題