C ++,合作FILE *和std流

时间:2013-06-19 15:29:28

标签: c++ c stream

我需要在C ++项目中使用现有的C库。 我的问题是C现有的库使用FILE *作为流,是否有一种标准的兼容方式来使用FILE *流来放置或从C ++流中获取?

我尝试在C ++ 11标准中寻找FILE *,但只有少数例子才会出现。

 -

编辑,例如。
我们有一个写入文件* *的功能 fputs(char const *,FILE *)

我们有一个输出C ++流:
auto strm = std :: cout;

我是否可以按照标准的方式使用fputs写入strm?

您还可以考虑使用C函数的类似输入示例,该函数从FILE *和输入C ++流中读取。

3 个答案:

答案 0 :(得分:2)

检查这个答案,

https://stackoverflow.com/a/5253726/1807864

#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
ofstream ofs("test.txt");
ofs << "Writing to a basic_ofstream object..." << endl;
ofs.close();

int posix_handle = ::_fileno(::fopen("test.txt", "r"));

ifstream ifs(::_fdopen(posix_handle, "r")); // 1

string line;
getline(ifs, line);
ifs.close();
cout << "line: " << line << endl;
return 0;
}

答案 1 :(得分:1)

C ++标准,除了极少数例外,都说C功能都包含在内。当然,支持所有stadnard C FILE *功能[显然需要对平台上FILE *的一般支持 - 一般情况下没有'文件'的嵌入式系统(例如,没有存储空间)对FILE *几乎没有太多有用的支持--C ++风格fstream也不会有效。

因此,只要您不尝试同时从C ++ fstream和C FILE *混合读/写同一文件,它就可以正常工作。但是,您需要在C ++和C访问之间关闭文件。

答案 2 :(得分:0)

据我了解,这样做是non-portable and non-standard。它是否在实践中起作用是另一个问题。我会围绕你的遗留代码创建包装类,或者像在C中一样直接使用FILE *流 - 它们并没有那么糟糕。 :)