我试图用字符串和整数读取二进制文件...并打印出对应于字符串的整数

时间:2017-02-05 23:34:35

标签: c++ string file binary

我试图用字符串和整数读取二进制文件,并在同一行打印出对应于字符串的整数。我知道如何读取二进制文件中的整数,如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;

1 个答案:

答案 0 :(得分:0)

有许多不同的方法可以在二进制文件中序列化字符串。最常见的方式是:

  1. 长度前缀字节序列,长度存储为整数值,长度通常为1,2或4个字节,后跟数据本身,例如0x04 0x46 0x4F 0x4F 0x440x04 = 4个字节,46,4F,4F,44 == "FOOD")。因为声明了长度,所以不需要sentinel标记,这也允许在字符串中使用零字节。 1.1。有时会使用可变长度的整数,但这是一种高级技术。
  2. 使用哨兵标记值,通常是NULL '\0'字符,例如0x46 0x4F 0x4F 0x44 0x00
  3. 或者文件格式指定字符串具有固定长度,在这种情况下,既不需要带内长度声明也不需要sentinel,尽管有时规范会说如果字符串的实际长度小于固定长度,那么null '\0'个字节可以用作填充。
  4. 您的问题没有提及任何会暗示您使用哪种格式的规范。

    请注意,如果您只想将整个文件读入内存,则应使用内存映射文件以获得更好的性能,但这需要平台支持。您可以使用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;