gpt4 book ai didi

c++ - 如何从 POSIX 文件描述符构建 C++ fstream?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:43:45 24 4
gpt4 key购买 nike

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

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

最佳答案

摘自 Éric Malenfant 的回答:

AFAIK, there is no way to do this in standard C++. Depending on your platform, your implementation of the standard library may offer (as a nonstandard extension) a fstream constructor taking a file descriptor as input. (This is the case for libstdc++, IIRC) or a FILE*.

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


libstdc++

有不规范__gnu_cxx::stdio_filebuf继承 std::basic_streambuf 并具有以下构造函数的类模板

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

with description 此构造函数将文件流缓冲区与打开的 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;
}

微软Visual C++

以前有不规范version ifstream 的构造函数采用 POSIX 文件描述符,但它在 current 中都丢失了文档和代码。还有另一个非标准版本的 ifstream 的构造函数采用 FILE*

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

而且它没有记录(我什至找不到任何旧的文档)。我们调用它(第 1 行),参数是调用 _fdopen 的结果。从 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;
}

关于c++ - 如何从 POSIX 文件描述符构建 C++ fstream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com