如何从POSIX文件描述符构造一个c fstream?

我基本上寻找一个C版本的fdopen()。我做了一些研究,这是其中一个似乎应该很容易,但事实证明是非常复杂的事情之一。我在这个信念中缺少一些东西(即它真的很容易)?如果没有,是否有一个好的图书馆有地方处理这个?

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

从ÉricMalenfant给出的答案:

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),然后我们将它传递给istream的构造函数作为basic_streambuf(行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;
}

Microsoft Visual C

以前有一个非标准version的ifstream的构造函数采用POSIX文件描述符,但它从current docs和代码丢失。还有另一个非标准版本的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;
}
http://stackoverflow.com/questions/2746168/how-to-construct-a-c-fstream-from-a-posix-file-descriptor

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何从POSIX文件描述符构造一个c fstream?