使用 POSIX 文件描述符写入 std::streambuf 的实现

Write implementation of std::streambuf with POSIX file descriptors

提问人:Gian Laager 提问时间:7/13/2022 最后编辑:Gian Laager 更新时间:7/13/2022 访问量:262

问:

我想实现一个使用 POSIX 文件描述符的 std::streambuf,这样我就可以将它与 和 一起使用。std::istreamstd::ostream

因为我只需要覆盖,但是当我一无所获时,会从实际文件中读取。我已经研究了它的实现,似乎它根本没有使用,而是使用未标记为虚拟的。std::ostreamstd::streambuf::xsputnstd::streambuf::xsgetnstd::istreamoperator>>xsgetnsnextc

我现在的问题是,我必须重载哪些函数才能获得完整的实现,以及基类已经处理了哪些部分?std::streambuf

我目前的实现如下所示:

#include "fstream"
#include "fcntl.h"
#include "unistd.h"

class fd_streambuf : public std::streambuf
{
    int fileDescriptor;
public:
    fd_streambuf(int fileDescriptor) : fileDescriptor(fileDescriptor)
    {
    }

    ~fd_streambuf() override
    {
        close(fileDescriptor);
    }

    int sync() override
    {
        return fsync(fileDescriptor);
    }

    std::streamsize xsputn(const char* s, std::streamsize n) override
    {
        return write(fileDescriptor, s, n);
    }

    std::streamsize xsgetn(char* s, std::streamsize n) override
    {
        return read(fileDescriptor, s, n);
    }
};

int main()
{
    int fd = open("/tmp/test.txt", O_RDWR | O_CREAT, S_IRWXU);
    fd_streambuf fd_streambuf(fd);
    std::ostream os(&fd_streambuf);
    os << "Hello, world!" << std::endl;
    fd_streambuf.sync();

    std::istream is(&fd_streambuf);
    std::string fileContent;
    is >> fileContent;

    assert(fileContent == "Hello, world!");
    return 0;
}

当您运行此“Hello, world!”时,将写入“test.txt”,但istream无法读取它。

C++ 标准 IOSTREAM

评论

0赞 john 7/13/2022
你必须覆盖,也许underflowuflow
0赞 john 7/13/2022
对于您应该覆盖的输出,您只是幸运地只覆盖了overflowxsputn
0赞 Gian Laager 7/13/2022
好的,我已经查看了 cpp 引用的规范,我不明白当不会发生什么overflowchEOF
0赞 john 7/13/2022
如果您要使用无缓冲 I/O,则只需输出它
0赞 john 7/13/2022
如果您确实要管理缓冲区,则 1) 输出缓冲区的现有内容(如果存在) 2) 创建缓冲区(如果不存在) 3) 将给定字符存储在缓冲区中。

答: 暂无答案