通过C 在类中读取二进制数据
Reading Binary Data with streambuf in C++ through a Class
我是一个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%02Xn", byte);
return;
}
我的读取标题正在倾倒第一个字节,但基于输出,请参见First Byte (in readHeader): 0xFF
void MyParser::readHeader() {
unsigned char byte = pbuf->sgetc();
printf("First Byte (in readHeader): 0x%02Xn", byte);
}
我的主要主管只是创建一个解析器,然后尝试读取
void main() {
MyParser parser("../data/data.bin");
parser.readHeader();
}
我认为解决问题的解决方案是创建new
StreamBuffer,但new streambuf(file.rdbuf())
对我不起作用。有建议吗?
您的程序的行为不确定:保留的流缓冲区由您在构造函数的主体中打开的std::ifstream
拥有。当此对象死亡时,流缓冲区也会释放。避免此问题的最简单方法是让您的std::ifstream
成为班级的成员:这将流的寿命绑定到您的对象。使用std::istream
接口进行解析也可能更容易,而不是某种尴尬的std::streambuf
接口。
如果您真的只想使用流缓冲区,则可以使用new filebuf
和open()
直接使用CC_11分配std::filebuf
。要保留指针,您可能会使用std::unique_ptr<std::filebuf>
(如果不使用C 2011)。使用指针类安排自动释放对象。当然,指针仍然是您班级的成员,以使生活时间正确。
您尝试复制流缓冲区的尝试无效,因为流缓冲区不可复制。您需要直接创建文件缓冲区:
MyParser::MyParser(std::string const& filename)
: pbuf(new std::filebuf)
{
this-pbuf->open("whatever", std::ios_base::in);
...
}
您需要一些新的C 教材,因为(对不起),但这是如此错误。您需要将FileStream声明为会员,在此程序中的任何地方都不需要任何new
,几乎没有人需要处理streambuf
。
class MyParser {
std::ifstream file;
public:
MyParser(string filepath) {
file.open(filepath, std::ios::in | std::ios::binary );
char byte;
file.read(sizeof(byte), &byte);
printf("First Byte (in constructor): 0x%02Xn", byte);
}
void readHeader() {
char byte;
file.read(sizeof(byte), &byte);
printf("First Byte (in readHeader): 0x%02Xn", byte);
}
};
- 正在读取二进制文件(is_open)
- 如何从dicom文件中读取二进制数据
- C++用于从流中读取二进制值的任何标准库
- readsome() 适合在 Windows 上读取二进制数据吗?
- 读取二进制文件并解释为整数
- 读取二进制文件直到结束 c++
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?
- 读取二进制文件的惯用C++17标准方法是什么
- 从末尾读取二进制文件
- C++逐个字符读取二进制文件字符
- 读取二进制文件大小的短自上周以来停止工作
- 读取二进制文件时出现问题
- 读取二进制文件时如何输出?
- C++:如何在线程中读取二进制文件并将其写入另一个线程?
- 在C 中读取二进制文件会返回意外值
- 尝试读取二进制文件会清除文件本身
- C 读取二进制文件
- 通过C 读取二进制文件的问题
- 用ifstream read()读取二进制的结构
- ifstream读取二进制文件在发行模式下工作,但在调试模式下不使用