我正在玩mkstemp(),它提供了一个文件描述符,但我想通过fprintf()生成格式化的输出.有没有一种简单的方法可以将mkstemp()提供的文件描述符转换为适合与fprintf()一起使用的FILE*结构?
一个元组,包含一个打开文件的操作系统级句柄(由os.open()返回)和该文件的绝对路径名,按顺序排列.
如何将操作系统级别的句柄转换为文件对象?
要将文件描述符包装在"文件对象"中,请使用fdopen().
所以我尝试过:
>>> import tempfile
>>> tup = tempfile.mkstemp()
>>> import os
>>> f = os.fdopen(tup[0])
>>> f.write('foo\n')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud) 好的,mkstemp是在POSIX中创建临时文件的首选方法.
但它会打开文件并返回一个int文件描述符.从那以后我只能创建一个FILE*,而不是一个std::ofstream,我更喜欢C++.(显然,在AIX和其他一些系统上,您可以std::ofstream从文件描述符创建一个,但是当我尝试时,我的编译器会抱怨.)
我知道我可以获得一个临时文件名,tmpnam然后用它打开我自己的ofstream,但由于竞争条件,这显然是不安全的,并导致编译器警告(Linux上的g ++ v3.4.):
warning: the use of `tmpnam' is dangerous, better use `mkstemp'
Run Code Online (Sandbox Code Playgroud)
那么,是否有任何可移植的方法来创建std::ofstream临时文件?
任何人都可以指向我在Win32上实现mkstemp()(C/C++)的代码,或非常接近的模拟代码.
必须是无种族的.
应该看起来像
#include <windows.h>
#include <io.h>
// port of mkstemp() to win32. race-free.
// behaviour as described in http://linux.die.net/man/3/mkstemp
//
int mkstemp(char *template) {
...
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在转换使用POSIX临时文件FILE到C++标准库iostreams的程序.什么是mkstemp的正确替代品?
我正在创建一个tmp文件:
from tempfile import mkstemp
Run Code Online (Sandbox Code Playgroud)
我想写这个文件:
tmp_file = mkstemp()
file = open(tmp_file, 'w')
file.write('TEST\n')
Run Code Online (Sandbox Code Playgroud)
事实上,我关闭文件并正确执行但是当我尝试捕获tmp文件时,它仍然是空的..它看起来基本但我不知道为什么它不起作用,任何解释?
通常我使用with语句在Python中处理文件,就像在这个块中通过HTTP下载资源一样:
with (open(filename), "wb"):
for chunk in request.iter_content(chunk_size=1024):
if chunk:
file.write(chunk)
file.flush()
Run Code Online (Sandbox Code Playgroud)
但这假设我知道文件名.假设我想使用tempfile.mkstemp().此函数返回打开文件和路径名的句柄,因此open在with语句中使用将是错误的.
我搜索了一下,发现了很多关于小心使用的警告mkstemp.一些博客文章几乎喊出来,当他们说不要扔掉返回的整数mkstemp.有关os级文件句柄与Python级文件对象不同的讨论.这没关系,但我找不到最简单的编码模式来确保这一点
mkstemp 被调用来获取要写入的文件with(open...模式获得的行为.所以我的问题是,在Python中有一种很好的方式来创建和写入mkstemp生成的文件,可能使用不同类型的状态,或者我必须手动执行类似fdopen或close等等.似乎应该有一个明确的这种模式.