【问题标题】:C++, cooperating FILE* and std streamsC++,协作 FILE* 和 std 流
【发布时间】:2013-06-16 05:25:31
【问题描述】:

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

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

 -

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

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

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

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

【问题讨论】:

  • 您的问题是“我可以在 C++ 程序中使用FILE * 功能吗?”
  • 您仍然可以在 C++ 中使用 C 标准函数。如果函数需要FILE*,则使用fopen 来获取它。
  • 我的问题是:“有没有一种符合标准的方式来使用 FILE* 流来放置或从 C++ 流中获取?”
  • 我加了一个例子,希望更清楚。

标签: c++ c stream


【解决方案1】:

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

【讨论】:

  • 虽然我不同意你的说法,但你的链接在任何地方都没有提到FILE
【解决方案2】:

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

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

【讨论】:

  • 所以,您的意思是:不,您不能使用 FILE* 来放置或从 C++ 流中获取?
  • 我的意思是,你不能同时使用同一个文件来混合它们。只要文件被关闭以一种方式使用它。但是您当然可以在 C++ 中同时使用两者。只是不是同时来自同一个文件。
  • 如果您也使用 FILE * 打开同一个文件两次,这将适用 - 它不应该以这种方式工作。
【解决方案3】:

检查这个答案,

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;
}

【讨论】:

  • 是和不是。它不是可移植的,因为它不是标准的一部分,但它被 MSVC++ 支持(至少)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多