2014-10-03 32 views
0

我想創建一對臨時文件來寫入和讀取,然後在程序完成時被破壞。我看過tmpfile,這很好,但我想知道該文件的名稱。我已閱讀ofstream的文檔,但我認爲我沒有正確實施。我想要做的事:C++文件IO持久臨時文件與tmpnam

  1. 創建具有是char xFile[64]類型和char yFile[64]兩個成員變量的類。
  2. 在構造函數中我把:std::tmpnam(xFile); std::tmpnam(yFile)。這將一個c字符串如/y3s3分配到xFile中。
  3. 我使用一種方法打開文件並添加一個字符串。
  4. xFile.good()每次評估爲false。

在點#3,我寫的東西像

void filemng::makeXCopy (std::string text) { 

    // actually I've tried fsteam and ifstream as well, shot in the dark 
    std::ofstream xfile(xFile, std::ofstream::out); 

    if(!xfile.good()) { 
     std::cerr << "Failed to open xFile.\n"; 
    } 

} 

當然,當我運行它,我看到 「無法打開xFile。」我在這裏看不到我做錯了什麼。

+1

使用mkstemp這是安全的。 – 2014-10-03 05:07:29

+0

自從我做C++以來已經過去了一年,對不起。在使用tmpnam時,它會填充一個唯一的文件名。我是否需要使用fstream或ofstream或ifstream來創建實際文件? – dirtymikeandtheboys 2014-10-03 05:09:54

+1

是的。但最好使用mkstemp – 2014-10-03 05:10:44

回答

0

下面是使用mkstemp做到這一點的例子:

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char name[255] = "/tmp/mytempfile_XXXXXX"; 
    int fd = mkstemp(name); 
    if (fd > 0) { 
     printf("Created %s\n", name); 
     write(fd, "some dataa\n", strlen("some dataa\n")); 
     close(fd); 
    } else { 
     printf("Failed \n"); 
    } 
    return 0; 
} 

注意,傳遞給mkstmp字符串「XXXXXX」將與一些獨特的字符串,這將使該文件名的目錄獨特的更換。

+0

謝謝。我應該用'tmpnam'來創建文件名的獨特部分嗎?對於臨時目錄,在Windows中,我是否需要使用其中一個win32 API函數來嘗試查找臨時目錄? – dirtymikeandtheboys 2014-10-03 05:25:21

+0

不可以。正如您看到提供給mkstemp的字符串/ tmp/mytempfile_XXXXXX中的「xxxxxx」部分被替換。前綴部分未被觸及。所以,你也可以傳遞類似「/ home/user/abcd/somename_xxxxxx」的東西。在這種情況下,該文件在/ home/user/abcd目錄中創建,名稱類似somename_n3VvAE – 2014-10-03 05:30:09