如何使用C ++读取具有混合二进制和ASCII数据的文件

时间:2013-04-01 21:52:25

标签: c++ ascii tokenize binary-data

我需要使用C ++和纯std(无Boost)读取带有混合二进制和ASCII数据的文件。此数据通常包含嵌套二进制和ASCII标头的混合,后跟二进制数据和逗号分隔数据。数据没有很好地对齐,二进制头定义了ASCII数据的字节数,从头到头可以变化。数据的一部分如下所示:

[binary header][binary data]The,ASCII,data,[binary header][binary data]is,not,continuous,...

我找到了很好的教程,使用读取表示二进制数据, getline 表示ASCII数据,我知道我可以使用字符逐字节读取,但我想知道是否你们中的任何一个人以前都必须处理这种情况,并就解决这个问题的最佳方法提出任何有用的建议。

2 个答案:

答案 0 :(得分:3)

如果要解析文件,则需要事先知道它是如何构造的。

虽然一个文件可以是一个表,其中列以逗号分隔,行由新行分隔,但另一个文件可能是XML或具有特定字段定义的完全二进制文件。

如果混合使用二进制和ASCII数据,则必须将其全部读取为二进制文件。

ASCII字符只不过是代表可读字符的二进制数字。

因此,您需要事先知道文件的构建方式以及文件中每个字节的含义。

读取此类文件的一种常见方法是使用文件中的字段创建一个结构,然后将文件读入其中。

例如:

#include <stdio.h>
#include <stdlib.h>

typedef struct mystruct_st
{
     int var1;
     char var2;
     char text[10];
}mystruct_t;

mystruct_t mystruct;

int main () {
    FILE * pFile;

    pFile = fopen ( "myfile.bin" , "rb" );
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

    fread (&mystruct,sizeof(mystruct_t),1,pFile);

    fclose (pFile);
    return 0;
}

答案 1 :(得分:1)

唯一真正的问题是知道你在哪里改变 文件中的格式。您必须以二进制文件打开该文件 模式(但通常情况下是便携式文件 无论如何)。除此之外,你必须要知道何时切换 在二进制格式之间(你必须实现, 因为标准中没有一个)和文本格式。