2012-07-24 126 views
-1

我想通過調用tmpfnam函數來獲取臨時文件名並使用它創建寫入文件,但我的C++程序中創建了一個臨時文件代碼無法創建臨時文件。然而,當我使用用戶提供的文件名或字符串常量而不是使用來自tmpfnam的臨時名稱時,文件創建工作得非常好。這裏有一個例子:無法在Windows上用C++創建臨時文件使用tmpfnam

std::tmpnam(fname); //does not work 
std::fstream f(fname,std::ios::out); 

char* fname = "myfile.txt"; //works 
std::fstream f(fname,std::ios::out); 

我查了一下,在殼體2中的文件在同一目錄下的源文件被創建,但不是在情況1.我試圖運行在管理員權限的程序,以及仍然沒有運氣 。任何想法爲何如此?

+0

你傳遞給'tmpnam'的是什麼?足夠大嗎? – cnicutar 2012-07-24 20:02:24

+1

我覺得你能夠寫入與可執行文件相同的目錄是令人驚訝的。可執行文件不得位於受保護的位置。 – 2012-07-24 20:02:50

+0

@cnicutar'fname'被聲明爲大小'L_tmpnam',所以它應該可以正常工作。 – adi 2012-07-24 20:09:47

回答

1

你試過了嗎this的方式?

char fname[L_tmpnam]; 
if (std::tmpnam(fname)) { 
    std::fstream f(fname,std::ios::out); 
    // ... 
} 

希望它有幫助。

+0

我試過這種方式,和std :: tmpnam確實返回NULL。但是,如何創建臨時文件? – adi 2012-07-24 20:19:50

+0

@adi您可以嘗試舊的C備用'tempnam'(請參閱:[Open Group](http://pubs.opengroup.org/onlinepubs/007904875/functions/tempnam.html)或[Microsoft](http:// msdn.microsoft.com/en-us/library/hs3e7355(v=vs.110).aspx)) – 2012-07-28 00:15:03

+0

謝謝傑弗裏,但我發現'tmpfnam'會返回一個臨時文件名,前面加'\',因爲windows在文件名中不允許'\',我的fstream對象無法創建文件。 – adi 2012-07-28 06:42:49

相關問題