如何从 POSIX 文件描述符构造 C++ fstream?

2024-03-31

我基本上是在寻找 fdopen() 的 C++ 版本。我对此做了一些研究,这是看起来应该很容易但事实证明非常复杂的事情之一。我是否在这个信念中遗漏了一些东西(即它真的很容易)?如果没有,是否有一个好的图书馆可以处理这个问题?

编辑:将我的示例解决方案移至单独的答案。


根据 Éric Malenfant 给出的答案:

AFAIK,没有办法做到这一点 标准C++。取决于您的 平台,您的实施 标准库可能提供(作为 非标准扩展)fstream 构造函数获取文件描述符 作为输入。 (这种情况是 libstdc++、IIRC) 或 FILE*。

根据上述观察和我下面的研究,有两种变体的工作代码;一个用于 libstdc++,另一个用于 Microsoft Visual C++。


libstdc++ 库

有不标准的__gnu_cxx::stdio_filebuf http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.6/a00068.html继承的类模板std::basic_streambuf并具有以下构造函数

stdio_filebuf (int __fd, std::ios_base::openmode __mode, size_t __size=static_cast< size_t >(BUFSIZ)) 

有描述此构造函数将文件流缓冲区与打开的 POSIX 文件描述符相关联。

我们通过 POSIX 句柄创建它(第 1 行),然后将它作为 basic_streambuf 传递给 istream 的构造函数(第 2 行):

#include <ext/stdio_filebuf.h>
#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"));

    __gnu_cxx::stdio_filebuf<char> filebuf(posix_handle, std::ios::in); // 1
    istream is(&filebuf); // 2

    string line;
    getline(is, line);
    cout << "line: " << line << std::endl;
    return 0;
}

微软视觉C++

以前有不标准的version http://msdn.microsoft.com/en-us/library/aa243822%28v=VS.60%29.aspxifstream 的构造函数采用 POSIX 文件描述符,但缺少这两个文件描述符current http://msdn.microsoft.com/en-us/library/zek0beca%28v=VS.100%29.aspx文档和代码。 ifstream 的构造函数还有另一个非标准版本,它采用 FILE*

explicit basic_ifstream(_Filet *_File)
    : _Mybase(&_Filebuffer),
        _Filebuffer(_File)
    {   // construct with specified C stream
    }

并且它没有记录(我什至找不到任何旧文档)。我们调用它(第 1 行),参数是调用的结果_fdopen http://msdn.microsoft.com/en-us/library/dye30d82%28v=VS.100%29.aspx从 POSIX 文件句柄获取 C 流 FILE*。

#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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 POSIX 文件描述符构造 C++ fstream? 的相关文章

随机推荐

  • 修改访客的捆绑属性

    我应该如何从访问者内部修改顶点的捆绑属性 我想使用对图进行子脚本化的简单方法 但传递给访问者的图参数是 const 因此编译器不允许更改 我可以在访问者中存储对图表的引用 但这看起来很奇怪 A visitor which identifie
  • 计算 Java 对象的值?

    我有一个用于存储项目的 Java 对象 public class PaymentDetailsItem private String name private String amount private int quantity priva
  • 在 Excel5.php 中找不到类“PHPExcel”

    我在 PHPExcel 中收到以下错误 Fatal error Class PHPExcel not found in PHPExcel Reader Excel5 php on line 587 这很奇怪 因为我在网上搜索时没有遇到过它
  • 尽管 rake 路线中有一条路线,但没有路线匹配

    我变得奇怪ActionController RoutingError No route matches 可以生成路线 gt r Rails application routes gt r generate controller items
  • 通用语言对 PCRE(Perl 兼容正则表达式)有哪些支持?

    我对 PCRE Perl 兼容正则表达式 的强大功能很感兴趣 并且想知道它们是否有可能成为所有主要语言中事实上的方法 我对 Java 感兴趣 如果有必要 我准备使用图书馆 我也无法在 SO 中找到一个很好的页面来描述 PCRE 的优缺点 因
  • Web 服务存根生成 + android

    我想生成一个基于 android java 的 STUB 来访问所有 Web 服务 我尝试使用以下工具生成存根 1 用于 CLDC 的 Sun Java TM 无线工具包 2 5 2 01 2 ksoap2 生成 stub 0 1 SNAP
  • 我可以使用特征稀疏矩阵来满足一般存储需求吗

    我需要一个模板化的稀疏矩阵实现 但只是为了减少内存占用 not进行任何数值求解 所以我尝试使用 Eigen 尽管我不需要数学部分 为什么 它恰好就在我的机器上 而且我已经用它来做其他事情了 但我肯定不是本征专家 Context 我有一个类型
  • 使用 LINQ 查询初始化 List

    我正在初始化一个List
  • Perl chomp 将多位数字变成 1 或 0

    我遇到一种情况 我需要用 Perl 读取一个充满数字的文件 这本身工作得很好 但是当我尝试删除每一行时 它会将以前的 5 或 6 位数字变成 1 或 0 Ideas 我需要对数字进行咀嚼以将文件路径与它们组合起来 因此回车符是一个问题 你没
  • 如何从 BroadcastReceiver 发出通知?

    如何从 BroadcastReceiver 发出通知 不能使用大多数方法 也不能使用 this 我需要它来打开一个包含数据库信息的活动我已经做到了 但现在必须的方法不起作用 我不能使用 这个 In the onReceive方法你得到一个C
  • LibGDX 将 BitmapFont 绘制到中间位置(spritebatch)

    我想使用 BitmapFont 绘制一些文本 临时位置 然后绘制该位置的一部分 到最后的精灵批次 我当时正在考虑画画 到临时 spritebatch 但不可能 将 spritebatch 绘制到另一个上 我怎样才能做到这一点 您可以使用帧缓
  • C - 返回指向局部变量的指针的函数

    考虑以下代码 include
  • Oracle 10g PL/SQL Connect By Prior 返回同一行上的子级和父级

    Table1 Child Parent a Bob Chris 2 Chris Kate 1 Shane Lana 3 Nala Bob 4 Table2 b Talent 1 something 2 nothing 3 something
  • CurrentThreadTaskScheduler 未完成同步

    我尝试为视图模型编写单元测试 但在尝试验证 ICommand 调用异步方法两次时遇到了困难 我使用 Moq 作为我的依赖项 我像这样设置了异步方法 this communicationServiceFake Setup x gt x Wri
  • 将列表的 2 个数据框中的因子转换为数值

    我在将列表中 2 个数据框的列转换为数字时遇到问题 现在两个数据框都有 2 列由因素组成 我想将它们转换为数字 以便我可以对它们进行数学运算 下面是示例代码 library XML bal lt http www baseball refe
  • 为什么不总是使用 HTTP post 进行 ajax 调用?

    我知道 HTTP get 和 post 方法之间的区别 如详细信息中所述this https stackoverflow com questions 46585 when do you use post and when do you us
  • 如何在 GWT 中实现 JQueryUI 滑块

    我最近需要在 GWT 中实现一个滑块来捕获用户在任务上取得的进度百分比 我对 GWT 孵化器中的滑块并不满意 并且不太热衷于使用 spiffy UI 或 SmartGWT 等外部库 我可以使用哪些替代方案在 GWT 中实现有效的滑块 而不需
  • Spark:在不更改列的可为空属性的情况下转换小数

    将列转换为DecimalType in a DataFrame似乎改变了可为空的属性 具体来说 我有一个不可为空的类型列DecimalType 12 4 我把它投射到DecimalType 38 9 using df withColumn
  • 2d(3d) 坐标的哈希图(即双精度向量)?

    我想知道是否有一个通用的全能解决方案hash map对于坐标 2d 或 3d 即双精度向量 一个例子here https stackoverflow com questions 7222143 unordered map hash func
  • 如何从 POSIX 文件描述符构造 C++ fstream?

    我基本上是在寻找 fdopen 的 C 版本 我对此做了一些研究 这是看起来应该很容易但事实证明非常复杂的事情之一 我是否在这个信念中遗漏了一些东西 即它真的很容易 如果没有 是否有一个好的图书馆可以处理这个问题 编辑 将我的示例解决方案移