- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是一名 C 程序员,正试图在 C++ 中开始我人生的新阶段(我知道我仍在使用下面的 printf,但那是因为格式化非常简单)。我希望从对象的成员函数中打印出数据文件的第一个字节。我认为我的流缓冲区在我可以读取它的数据之前就被破坏了,但我不知道该怎么做。
我的类如下所示
class MyParser {
MyParser(string filepath);
void readHeader();
streambuf *pbuf;
long size;
}
我的构造函数打开文件,取出缓冲区,输出第一个字节并返回。 (我认为 pbuf
在这段代码的末尾快要死了)。此代码输出 First Byte (in constructor): 0x8C
MyParser::MyParser(string filepath) {
ifstream file(filepath.c_str(), ios::in | ios::binary)
pbuf = file.rdbuf();
size = pbuf->pubseekoff(0,ios::end,ios::in);
pbuf->pubseekpos(0,ios::in);
unsigned char byte = pbuf->sgetc();
printf("First Byte (in constructor): 0x%02X\n", byte);
return;
}
我的读取 header 正在转储第一个字节,但根据输出,所有内容都是 First Byte (in readHeader): 0xFF
void MyParser::readHeader() {
unsigned char byte = pbuf->sgetc();
printf("First Byte (in readHeader): 0x%02X\n", byte);
}
我的 main 只是创建一个解析器并尝试读取 Header
void main() {
MyParser parser("../data/data.bin");
parser.readHeader();
}
我认为我的问题的解决方案是创建一个 new
流缓冲区,但 new streambuf(file.rdbuf())
对我不起作用。有什么建议吗?
最佳答案
您的程序有未定义的行为:您保留的流缓冲区属于std::ifstream
。您在构造函数的主体中打开。当此对象死亡时,流缓冲区也会被释放。避免此问题的最简单方法是让您的 std::ifstream
成为您类(class)的成员:这将流的生命周期绑定(bind)到您的对象。使用 std::istream
也可能更容易用于解析的界面,而不是有点笨拙的 std::streambuf
界面。
如果你真的只想使用一个流缓冲区,你可以分配一个 std::filebuf
使用 new filebuf
和 open()
直接文件流。要保留指向它的指针,您可能会使用 std::unique_ptr<std::filebuf>
(或 std::auto_ptr<std::filebuf>
如果您不使用 C++ 2011)。使用指针类安排对象的自动释放。当然,指针仍将是您类(class)的成员,以使生命周期正确。
您复制流缓冲区的尝试失败,因为流缓冲区不可复制。您需要直接创建文件缓冲区:
MyParser::MyParser(std::string const& filename)
: pbuf(new std::filebuf)
{
this-pbuf->open("whatever", std::ios_base::in);
...
}
关于c++ - 通过类在 C++ 中使用 streambuf 读取二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13102947/
我试图理解 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,所以我坚持将所有内容读入流缓冲区。
我是一名优秀的程序员,十分优秀!