gpt4 book ai didi

c++ - 通过类在 C++ 中使用 streambuf 读取二进制数据

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:32 26 4
gpt4 key购买 nike

我是一名 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 filebufopen()直接文件流。要保留指向它的指针,您可能会使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com