0

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

我尝试在 C++11 标准中寻找 FILE* ,但它只出现在几个例子中。

 -

编辑,例如。
我们有一个写入 FILE* 的函数:
fputs(char const*, FILE*)

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

我可以以符合标准的方式使用 fputs 写入 strm 吗?

您还可以考虑一个类似的输入示例,其中包含一个从 FILE* 和输入 C++ 流中读取的 C 函数。

4

3 回答 3

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;
}
于 2013-06-19T15:44:52.953 回答
1

C++ 标准,除了极少数例外,都表示 C 功能都包含在内。当然,支持所有标准 CFILE *功能[显然受平台上的一般支持FILE *- 没有“文件”(例如,没有存储)的嵌入式系统通常几乎不会有太多有用的支持FILE *- 也不会C++ 风格的fstream工作]。

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

于 2013-06-19T15:35:39.020 回答
0

据我了解,这样做是非便携式和非标准的。它在实践中是否有效是另一个问题。我会围绕你的遗留代码创建包装类,或者像在 C 中一样直接使用 FILE* 流——它们还不错。:)

于 2013-06-19T15:32:12.087 回答