- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在定义一个自定义 std::streambuf
类以用于文件 I/O。在这个类中,我正在重载函数 open
、close
、is_open
、xsgetn
、xsputn
、溢出
、下溢
和 uflow
。然后,我将此缓冲区插入到 std::ifstream
中,如下所示(同样的情况适用于 std::ofstream
):
std::ifstream temp;
Filebuffer *buffer = new Filebuffer();
buffer->open(fileName.c_str(), std::ios_base::in | std::ios_base::binary);
temp.basic_ios<char>::rdbuf(buffer);
Filebuffer
(我的自定义类)的实现如下:
std::streamsize
Filebuffer::xsputn(const char *s, std::streamsize n)
{
std::streamsize result = 0;
if(file && n)
{
for(;;)
{
size_t buffer_use = this->epptr() - this->pptr();
if(buffer_use > 0)
{
if(static_cast<int>(buffer_use) > n)
{
buffer_use = n;
}
std::char_traits<char>::copy(this->pptr(), s, buffer_use);
this->pbump(buffer_use);
result += buffer_use;
n -= buffer_use;
if(n == 0)
{
break;
}
s += buffer_use;
}
this->overflow(static_cast<int>(*s));
}
}
return result;
}
std::streamsize
Filebuffer::xsgetn(char *s, std::streamsize n)
{
std::streamsize result = 0;
if(file && n)
{
int ch; do
{
size_t buffer_use = this->egptr() - this->gptr();
if(buffer_use > 0)
{
if(static_cast<int>(buffer_use) > n)
{
buffer_use = n;
}
std::char_traits<char>::copy(s, this->gptr(), buffer_use);
this->gbump(buffer_use);
result += buffer_use;
n -= buffer_use;
if(n == 0)
{
break;
}
s += buffer_use;
}
ch = this->underflow();
} while(!(ch == std::char_traits<char>::eof()));
}
return result;
}
int
Filebuffer::underflow()
{
if(file)
{
nullify_put_area(); //clears write buffer
if(!buffer) //allocated in open()
{
int value = ungetc(fgetc(file), file);
if(value == EOF)
{
return std::char_traits<char>::eof();
}
return value;
}
char *begin = buffer;
char *end = buffer + bufferSize - 1; //bufferSize set to 4 KB
char *next = end;
if(this->gptr() < this->egptr())
{
size_t buffer_use = this->egptr() - this->gptr();
memmove(begin, next, buffer_use);
begin += buffer_use;
}
setg(begin, begin, begin);
size_t m = (bufferSize - 1 - (begin - this->eback()));
if(m > 0)
{
size_t status = fread(begin, 1, m, file);
if(status == 0)
{
return std::char_traits<char>::eof();
}
setg(this->eback(), this->gptr(), begin + status);
}
return static_cast<int>(*this->gptr());
}
return std::char_traits<char>::eof();
}
int
Filebuffer::uflow()
{
if(!file)
{
return std::char_traits<char>::eof();
}
int ch = underflow();
if(ch != std::char_traits<char>::eof())
{
if(buffer)
{
this->gbump(1);
}
else
{
fgetc(file);
}
}
return ch;
}
int
Filebuffer::overflow(int c)
{
if(!file)
{
return std::char_traits<char>::eof();
}
const char *begin = this->pbase();
char *next = this->pptr();
if(buffer)
{
setp(buffer, buffer + bufferSize - 1);
}
nullify_get_area(); //clears read buffer
char temp;
if(c == std::char_traits<char>::eof())
{
c = std::char_traits<char>::not_eof(std::char_traits<char>::eof());
}
else
{
if(!next)
{
begin = next = &temp;
}
assert(next == &temp || buffer <= next);
assert(next == &temp || next < buffer + bufferSize);
*next++ = static_cast<char>(c);
}
if(begin != next)
{
if(begin == &temp)
{
fputc(temp, file);
return c;
}
size_t n = next - begin;
size_t status = fwrite(begin, 1, n, file);
if(status != n)
{
return std::char_traits<char>::eof();
}
return c;
}
return std::char_traits<char>::eof();
}
不幸的是,每当我使用(例如)temp >> readVar;
时,它都不会使用我的任何重载函数 - 调用堆栈显示调用了 STL 原始实现 - 相反,只是读入垃圾。每this question ,我需要为 ofstream
定义 overflow
(并且可能为 ifstream
定义 underflow
),我已经完成了。我是否正确定义了 xsputn
和 xsgetn
?为什么我的重载函数没有被调用?
最佳答案
似乎尝试使用 std::ifstream
执行此操作将不起作用,我需要更改它 std::istream
。进行此更改后,将调用重载函数并且一切正常。
关于c++ - 创建自定义 std::streambuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30853370/
我试图理解 boost::asio::streambuf::consume() 和 boost::asio::streambuf::commit() 调用.在文档中,我们有示例, boost::asi
我搜索了其他帖子,但没有找到任何相关内容。现在,我有一个由 header 和正文组成的协议(protocol)。协议(protocol)是这样的:Z24,91009802,123456789ABCDE
为了接收带有自定义 header 以太网帧的原始协议(protocol),我正在使用 streambuf 缓冲区从以太网中读取字节。大部分有效载荷被成功复制,但我需要检查缓冲区中帧头的特定字节,以便我
我似乎无法很好地解释 consumer() 和 commit() 的真正含义,实际上我根本不了解 streambuf。 我的理解是streambuf只是一个字符数组。但是为什么在文档中, basic_
我正在定义一个自定义 std::streambuf 类以用于文件 I/O。在这个类中,我正在重载函数 open、close、is_open、xsgetn、xsputn、溢出、下溢 和 uflow。然后
我正在使用streambuf作为串口通信的存储 io_service io; serial_port sp(io); sp.open("COM4"); sp.set_option( serial_po
protected 虚拟成员函数 streambuf::xsgetn 使 I/O 流实现者能够定义一个函数,该函数从输入流中提取 n 个字符并将它们存储在缓冲区中. 通常,对于像fstream 这样的
我使用的是 simple file-slurp我决定添加一些错误检查。我很惊讶一个空文件会出错。这也不会发生在每个空序列上,“”工作正常。我还验证了 rdbuf() 正在返回一个非空指针。 #incl
我正在研究 boost::asio::streambuf 并发现我可以使用它发送/获取一个结构,但是当我发送一个结构时我无法获取它我已经发送了。文档说应该使用 commit() 和 consume()
我正在尝试将读取 gz 文件的代码打包成一个函数,源代码取自 https://techoverflow.net/2013/11/03/c-iterating-lines-in-a-gz-file-us
我有一个 Visual Studio 2008 C++ 项目,我在其中尝试将来自多个类的数据序列化为自定义 std::streambuf 实现。 数据类及其序列化: struct Header { /
我将 C++ streambuf 类用于编译器项目,需要一种方便的方法来获取流中的当前位置。 有两个成员函数,streambuf::pubseekpos 和一个streambuf::pubseekof
我对 boost asio::streambuf 类中的输入序列和输出序列感到困惑。 根据文档中的代码示例(用于发送数据),表示输入序列的缓冲区似乎用于写入套接字,而表示输出序列的缓冲区用于读取。 例
几天前,我决定编写一个使用mmap 和预读的streambuf 子类会很有趣。我查看了我的 STL (SGI) 如何实现 filebuf 并意识到 basic_filebuf 包含一个 FILE*。所
我正在尝试找到一种方法来获取读取或写入流的字符数,即使出现错误并且读/写结束很短也是可靠的。 我正在做这样的事情: return stream.rdbuf()->sputn(buffer, buffe
流的 streambuf 是否有可能在其原始流被销毁后仍然存在? streambuf* f() { ifstream my_stream; // ... return my_s
显然 boost::asio::async_read 不喜欢字符串,因为 boost::asio::buffer 的唯一重载允许我创建 const_buffer,所以我一直坚持将所有内容读入 stre
我不太明白使用 streambuf 相对于常规数组的优势。让我解释一下我的问题。我有一个使用 Rijndael 128 ECB + 一些简单密码加密的网络连接,用于加密小于 16 字节的剩余数据。数据
出于教育目的,我想创建一个 ostream 和流缓冲区来做: 在执行 << myVar; 时修复字节序 存储在双端队列容器中,而不是使用 std:cout 或写入文件 记录额外的数据,例如我做了多少次
显然 boost::asio::async_read 不喜欢字符串,因为 boost::asio::buffer 的唯一重载允许我创建 const_buffers,所以我坚持将所有内容读入流缓冲区。
我是一名优秀的程序员,十分优秀!