混合C和C ++文件操作

时间:2009-06-21 17:21:26

标签: c++ c

我正在编写一个文件分割程序,以帮助在iPod笔记中使用大文件。我想在cstdio中使用tmpfile()但它返回一个文件*而不是一个fstream对象。我知道在标准C ++中这是不可能的,但有没有人知道任何能够将FILE *转换为std :: fstream对象的标准能够很好的库?或者,如果不是标准或其他库中的tmpfile()功能?

谢谢!

我的操作系统是Windows XP,我使用Dev-C ++ 4.9.9.2或MS Visual Studio 2008作为我的编译器。

6 个答案:

答案 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.hext/stdio_sync_filebuf.h。如果您的编译器不是g ++,那么应该直接从libstdc ++中提取它们。