C++ C++;使用tmpnam的文件IO永久临时文件
我正在尝试创建两个临时文件以供写入和读取,然后在程序完成时将其销毁。我已经看到了C++ C++;使用tmpnam的文件IO永久临时文件,c++,ofstream,C++,Ofstream,我正在尝试创建两个临时文件以供写入和读取,然后在程序完成时将其销毁。我已经看到了tmpfile,这将非常好,但我也想知道该文件的名称。我已经阅读了stream的文档,但我认为我的实现不正确。我想做的是: 创建一个具有两个成员变量的类,这两个变量的类型分别为char xFile[64]和char yFile[64] 在构造函数中,我放置:std::tmpnam(xFile);std::tmpnam(yFile)。这会将类似于/y3s3的c字符串分配到xFile中 我使用一个方法打开文件并添加一个字
tmpfile
,这将非常好,但我也想知道该文件的名称。我已经阅读了stream的文档,但我认为我的实现不正确。我想做的是:
创建一个具有两个成员变量的类,这两个变量的类型分别为char xFile[64]
和char yFile[64]
在构造函数中,我放置:std::tmpnam(xFile);std::tmpnam(yFile)
。这会将类似于/y3s3
的c字符串分配到xFile中
我使用一个方法打开文件并添加一个字符串
xFile.good()每次的计算结果都是false
在第三点,我写了一些
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";
}
}
void filemng::makeXCopy(std::string text){
//事实上,我也尝试过fsteam和ifstream,在黑暗中拍摄
std::ofstream xfile(xfile,std::ofstream::out);
如果(!xfile.good()){
std::cerr以下是使用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;
}
#包括
#包括
#包括
#包括
int main()
{
字符名[255]=“/tmp/mytempfile_uuxxxxxx”;
int fd=mkstemp(名称);
如果(fd>0){
printf(“已创建%s\n”,名称);
写入(fd,“某些数据a\n”,strlen(“某些数据a\n”);
关闭(fd);
}否则{
printf(“失败的\n”);
}
返回0;
}
请注意“xxxxxx”在传递给MKSTMP的字符串中,将替换一些使字符串在目录中唯一的唯一字符串。< /P>使用MKSTEMP是安全的。从C++开始,已经过去一年了。抱歉,在使用TMPNM时,它填充了唯一的文件名。是否需要使用FString或OFFROW或IFFILE创建实际文件?是的,但最好是U。se mkstempa根据您发布的文档tmpnam()
需要数组的大小L\u tmpnam
如char xFile[L\u tmpnam];
(但可能不是导致错误的原因).mkstemp是tmpnam的安全替代品。谢谢。我是否应该使用类似于tmpnam
的方法来创建文件名的唯一部分?对于Windows中的临时目录,我是否需要使用win32 API函数之一来尝试查找临时目录?否。如您所见“xxxxxx”提供给mkstemp的字符串/tmp/mytempfile\uuxxxxxx中的部分将被替换。前缀部分不会被触碰。因此,您也可以传递类似“/home/user/abcd/somename\uxxxxxx”的内容。在这种情况下,文件是在目录/home/user/abcd中创建的,名称类似于somename\n3VvAE