提问人:Gian Laager 提问时间:7/13/2022 最后编辑:Gian Laager 更新时间:7/13/2022 访问量:262
使用 POSIX 文件描述符写入 std::streambuf 的实现
Write implementation of std::streambuf with POSIX file descriptors
问:
我想实现一个使用 POSIX 文件描述符的 std::streambuf,这样我就可以将它与 和 一起使用。std::istream
std::ostream
因为我只需要覆盖,但是当我一无所获时,会从实际文件中读取。我已经研究了它的实现,似乎它根本没有使用,而是使用未标记为虚拟的。std::ostream
std::streambuf::xsputn
std::streambuf::xsgetn
std::istream
operator>>
xsgetn
snextc
我现在的问题是,我必须重载哪些函数才能获得完整的实现,以及基类已经处理了哪些部分?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无法读取它。
答: 暂无答案
评论
underflow
uflow
overflow
xsputn
overflow
ch
EOF