我正在编写一个文件分割程序,以帮助在iPod笔记中使用大文件。我想在cstdio中使用tmpfile()但它返回一个文件*而不是一个fstream对象。我知道在标准C ++中这是不可能的,但有没有人知道任何能够将FILE *转换为std :: fstream对象的标准能够很好的库?或者,如果不是标准或其他库中的tmpfile()功能?
谢谢!
我的操作系统是Windows XP,我使用Dev-C ++ 4.9.9.2或MS Visual Studio 2008作为我的编译器。
答案 0 :(得分:2)
您可以通过<<<<<<<<<<<<<语法到std :: stringstream 然后将.str()。c_str()从它通过C-API写入到FILE *。
#include <sstream> #include <cstdio> #include <string> using namespace std; int main() { stringstream ss; ss << "log start" << endl; // ... more logging FILE* f_log = fopen("bar.log", "w"); string logStr = ss.str(); fwrite(logStr.c_str(), sizeof(char), logStr.size(), f_log); fclose(f_log); return 0; }
答案 1 :(得分:2)
如果您想要的只是一个临时文件,请改用tmpnam()。返回可用于临时文件的char *名称,因此只需打开具有该名称的fstream对象。
类似的东西:
#include <cstdio>
#include <fstream>
...
char name[L_tmpnam];
tmpnam(name);
//also could be:
//char *name;
//name = tmpnam(NULL);
std::fstream file(name);
但是,您必须使用remove()或其他方法自行删除文件。
答案 2 :(得分:0)
您可以使用 tmpnam mktmp获取临时文件名,使用流打开,然后使用remove将其删除。
char *name;
ifstream stream;
name = mktmp("filename");
stream.open(name);
//do stuff with stream here.
remove(name);//delete file.
答案 3 :(得分:0)
即使您设法将FILE *转换为std :: fstream,也不会像宣传的那样工作。 tmpfile()返回的FILE对象有一个特殊属性,当close()'d(或程序终止时),文件会自动从文件系统中删除。我不知道如何用std :: fstream复制相同的行为。
答案 4 :(得分:0)
您可以在FILE *周围编写一个简单的包装类,而不是使用std :: fstream,它会在销毁时关闭它。应该很容易。定义运算符,如&lt;&lt;有必要的。 请务必禁止复制,以避免多次close()调用。
答案 5 :(得分:0)
g ++在__gnu_cxx::stdio_filebuf
和__gnu_cxx::stdio_sync_filebuf
中有ext/stdio_filebuf.h
和ext/stdio_sync_filebuf.h
。如果您的编译器不是g ++,那么应该直接从libstdc ++中提取它们。