将整个二进制文件读入缓冲区,然后以特定格式解析它
read the whole binary into a buffer then resolve it in specific format
这是我的 C++ 作业。给定一个二进制文件,该文件由一些数据单元组成。每个数据单元包含两部分。第一部分是 1 char
,第二部分是 1int
。一次将整个文件读入缓冲区,然后从缓冲区中提取所有数据单元。
现在我已经像这样成功地将文件读入缓冲区:
char* readBinaryFile(const char* fileName) {
ifstream file(fileName, ios::binary || ios::ate);
// get the size of file
streampos beg, end;
beg = file.tellg();
file.seekg(0,ios::end);
end = file.tellg();
long size = end - beg;
char* buffer = new char[size];
// now read the file into buffer
file.seekg(0, ios::beg);
file.read(buffer, size);
file.close();
return buffer;
}
所以我的问题是如何从缓冲区中获取数据单元?
我不会为您编写代码,但请考虑一下...
在 buffer[0]
处是您的第一个字符。在 buffer[1]
到 buffer[4]
处是您的第一个整数。重复,所以buffer[5]
是第二组数据的字符。
character和int一共有五个字节。如果您知道已读取的数据量,则可以将其除以 5 并知道有 "sets" 个数据。
您现在可以使用类似 for
循环的方法从零迭代到集合数减一。假设这个迭代器变量是 i
,那么您可以使用 buffer[i * 5]
访问每个 "set" 数据的字符,buffer[i * 5 + 1]
处 int 的第一个字节,等等
因此,for 循环和一点数学知识将帮助您从该缓冲区中提取信息。你将有 5 个单独的字节,你需要将其中的 4 个字节重新组合成一个 int。有多种方法可以实现这一点,我会让您尝试发现。
您的问题是否源于您正在使用:
ios::binary || ios::ate
当我认为你的意思是:
ios::binary | ios::ate
前者的计算结果为“1”,因为二进制逻辑或末尾是 "true",后者是表示 "open this file in binary mode, and at the end" 的位掩码。你写的方式实际上相当于
ios::app
这是我的 C++ 作业。给定一个二进制文件,该文件由一些数据单元组成。每个数据单元包含两部分。第一部分是 1 char
,第二部分是 1int
。一次将整个文件读入缓冲区,然后从缓冲区中提取所有数据单元。
现在我已经像这样成功地将文件读入缓冲区:
char* readBinaryFile(const char* fileName) {
ifstream file(fileName, ios::binary || ios::ate);
// get the size of file
streampos beg, end;
beg = file.tellg();
file.seekg(0,ios::end);
end = file.tellg();
long size = end - beg;
char* buffer = new char[size];
// now read the file into buffer
file.seekg(0, ios::beg);
file.read(buffer, size);
file.close();
return buffer;
}
所以我的问题是如何从缓冲区中获取数据单元?
我不会为您编写代码,但请考虑一下...
在 buffer[0]
处是您的第一个字符。在 buffer[1]
到 buffer[4]
处是您的第一个整数。重复,所以buffer[5]
是第二组数据的字符。
character和int一共有五个字节。如果您知道已读取的数据量,则可以将其除以 5 并知道有 "sets" 个数据。
您现在可以使用类似 for
循环的方法从零迭代到集合数减一。假设这个迭代器变量是 i
,那么您可以使用 buffer[i * 5]
访问每个 "set" 数据的字符,buffer[i * 5 + 1]
处 int 的第一个字节,等等
因此,for 循环和一点数学知识将帮助您从该缓冲区中提取信息。你将有 5 个单独的字节,你需要将其中的 4 个字节重新组合成一个 int。有多种方法可以实现这一点,我会让您尝试发现。
您的问题是否源于您正在使用:
ios::binary || ios::ate
当我认为你的意思是:
ios::binary | ios::ate
前者的计算结果为“1”,因为二进制逻辑或末尾是 "true",后者是表示 "open this file in binary mode, and at the end" 的位掩码。你写的方式实际上相当于
ios::app