我试图用字符串和整数读取二进制文件,并在同一行打印出对应于字符串的整数。我知道如何读取二进制文件中的整数,如read(buffer,4),但我以前从未读过字符串。我实际上不知道这些字符串有多大.. 100bytes读取大部分文件但不是全部....文件格式看起来像这样。
jcake 567 sgrenon 17
我试图抓住名字后面的数字,然后将它们打印成iostream。我理解如何阅读int,因为通常有4个字节。我从来没有读过带有字符串的二进制文件。
while (readfile.good())
{
char*buffer = new char[100];
readfile.read(buffer, 100);
if (readfile.eof())
{
delete[] buffer;
break;
}
cout << buffer << endl;
答案 0 :(得分:0)
有许多不同的方法可以在二进制文件中序列化字符串。最常见的方式是:
0x04 0x46 0x4F 0x4F 0x44
(0x04
= 4个字节,46,4F,4F,44 == "FOOD"
)。因为声明了长度,所以不需要sentinel标记,这也允许在字符串中使用零字节。
1.1。有时会使用可变长度的整数,但这是一种高级技术。NULL
'\0'
字符,例如0x46 0x4F 0x4F 0x44 0x00
。'\0'
个字节可以用作填充。您的问题没有提及任何会暗示您使用哪种格式的规范。
请注意,如果您只想将整个文件读入内存,则应使用内存映射文件以获得更好的性能,但这需要平台支持。您可以使用Boost:http://www.boost.org/doc/libs/1_50_0/libs/iostreams/doc/classes/mapped_file.html
执行此操作如果您仍想将文件加载到缓冲区中,则需要分配足够大的缓冲区来包含该文件,您不希望使用静态分配的缓冲区(new char[100]
,因为如果它是低效的,该文件大于100字节,如果超过100字节则太小。
如果您正在使用ifstream
,请使用tellg()
方法获取文件长度,然后为其分配缓冲区:
using namespace std;
// ...
ifstream in( fileName, ifstream::ate | ifstream::binary );
streamsize length = in.tellg();
if( length <= 0 ) throw ...
size_t bufferLength = static_cast<size_t>( length );
char* buffer = new char[ bufferLength ];
in.read( buffer, bufferLength );
// do stuff with `buffer`
delete[] buffer;