2009-06-03 38 views
3

我需要生成隨機名稱,我將使用它來在目錄中創建臨時文件。目前我正在使用C標準函數tempnam()。我的代碼是用C++編寫的,並且希望使用C++等價物來完成相同的任務。該代碼需要在Solaris和Windows上工作。C++中的tempnam等效

有人知道C++中的這種東西嗎?任何指針在此將不勝感激。

回答

4

嘗試在cstdiostd::tempnam。 )

C標準庫仍然在C++代碼可用。爲了方便起見,他們提供了C++包裝器(頭文件爲'c'前綴,並且沒有擴展名),並且可以在std名稱空間中使用。

您也可以使用普通的C版(stdio.h中和的tempnam在全局命名空間,但你沒有問C++版本;))

C++標準庫只提供了新的功能,而實際上有空間改進。它有一個字符串類,因爲字符串類是對C指針的改進,而不是字符指針。它有一個矢量類,因爲它很有用。

對於像tempnam,將用C++來什麼能夠把黨的話,我們沒有已經由C有哪些?所以他們沒有做任何事情,除了使舊版本可用。

+1

務必小心,以分清哪些是`std`的,哪些不是。假設如果函數在中,則在`std`名稱空間中包含相同的函數是不安全的。這隻適用於標準附錄C.2中的功能,其標準中有209項標準。當包含時,可能會在中看到其他任何內容,但是沒有任何內容保證它位於`std`命名空間中。 – 2009-06-03 13:18:52

1

爲什麼不直接使用你當前在C中使用的相同函數? C++是落後與C

1

兼容有什麼不對的tempnam()?你可以使用正則的libc函數嗎? tempnam在stdio.h中,你可能已經包含了它。

0
#include <cstdio> 
using std::tmpnam; 
using std::tmpfile; 

您也應該檢查這個previous question on StackOverflow,並避免使用mkstemp創建文件競爭條件,所以我會建議使用的std :: TMPFILE

3

我知道這並不能回答你的問題,但作爲一個側注意,根據手冊頁:

的tempnam雖然(3)產生難以猜測的名字 ,它是 仍然可能是 時間之間的的tempnam(3)返回 路徑名和 程序打開它的時間,另一個程序 可能使用 open(2)創建該路徑名,或將其創建爲符號 鏈接。這可能導致安全漏洞。爲了避免這種可能性, 使用open(2)O_EXCL標誌打開 的路徑名。 或更好的是,使用 mkstemp(3)或tmpfile(3)