我需要在C ++项目中使用现有的C库。 我的问题是C现有的库使用FILE *作为流,是否有一种标准的兼容方式来使用FILE *流来放置或从C ++流中获取?
我尝试在C ++ 11标准中寻找FILE *,但只有少数例子才会出现。
-
编辑,例如。
我们有一个写入文件* *的功能
fputs(char const *,FILE *)
我们有一个输出C ++流:
auto strm = std :: cout;
我是否可以按照标准的方式使用fputs写入strm?
您还可以考虑使用C函数的类似输入示例,该函数从FILE *和输入C ++流中读取。
答案 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 *流 - 它们并没有那么糟糕。 :)