C++二进制文件正在读取结构
C++ binary file reading into struct
我使用如下结构编写了一个二进制文件:
struct block{
char data[32];
};
所以我最终得到的基本上是一个充满char[32]的大二进制文件。数据是在特定位置格式化的,因此获取特定的信息并不困难。然而,我试着这样阅读文件:
int lines=0;
std::ifstream inputFile("file.bin",std::ios::binary);
while (!inputFile.eof())
{
inputFile.read(blocks[lines].data, sizeof(block));
lines++;
}
inputFile.close();
lines--;
然后像这样显示:
std::cout<<"block 1: "<<blocks[0].data<<std::endl;
// etc ...
我认为block[I].data应该只给我属于索引I的char[32],但它却给了我结构中从索引到结构末尾的每个"data"元素。我确信这是我对其工作原理的误解。我的问题是:如何获得block[I].data表示的char[32]?
问题出在std::cout
输出语句上。当您尝试输出blocks[0].data
时,operator<<
得到的是而不是32个字符的数组,而是指向第一个字符的指针。这被解释为指向C字符串的指针,因此它从那时起输出在内存中找到的所有字符,直到找到' '
为止。由于每个数组元素只包含文件中的相应字符,因此会输出文件中的所有字符(除非文件中有' '
,否则输出将停止(。此外,您似乎(不(幸运的是,' '
在内存中跟随您的数据,因此输出停止在那里(而不是在之后继续输出内存中的任何内容,并可能在到达进程内存末尾时出现分段错误(。
要将32个字符输出为字符,请使用std::cout.write(blocks[0].data,32)
。否则,要将它们输出为int,只需循环通过它们,并将每个转换为int:
for (int i = 0; i < 32; ++i)
std::cout << static_cast<int>(blocks[0].data[i]) << ' ';
当然,您可以使用所有流操纵器来获得所需形式的数字(例如,std::hex
用于十六进制输出,和/或std::setw
和std::setfill
用于获得固定宽度的数字(。
std::cout<<"block 1: "<<blocks[0].data<<std::endl;
您正在向流发送一个char[]
,该流将被提升为char*
,因此它认为它是一个以NULL结尾的字符串,并尝试将其显示为NULL。很难说你想要什么,但这将以十六进制显示:
std::cout << std::setfill('0') << std::hex;
for(int i=0; i<25; ++i)
std::cout << std::setw(2) << blocks[0].data[i];
std::cout << std::setfill(' ') << std::dec;
您的输入部分需要更改:
while (inputFile.read(blocks[lines].data, sizeof(block))
{
lines++;
}
原因是直到AFTER发生读取操作后才确定EOF条件。使用EOF检查的一个副作用是可能会读取额外的一行。
- 将结构向量保存到文件中,并从C++文件中读取结构向量
- 从只读内存中读取结构
- 从包含 IP 标头片段的二进制文件中读取结构的最佳方法是什么
- 读取结构化文件
- CPP 在读取结构数据时无限循环错误?
- 打开文件以读取结构数组
- 无效操作数以二进制读取结构的阵列
- 读取结构数组时出错
- 如何从另一个类读取结构成员
- 读取结构 -- uint32 不命名类型
- 从流或字节中读取结构时遇到问题
- 读取结构C++二进制文件的运行时错误
- 从二进制文件读取结构数据时获取垃圾值
- 在 c++ 中向二进制文件写入/读取结构
- 在C++文件中写入和读取结构体的三维矢量
- C++按字段读取结构,并将结构直接写入流
- 从LISP的套接字中读取c++结构
- 读取结构化二进制文件c++
- C++二进制文件正在读取结构
- 从CArchive保存的二进制数据中读取结构数组