3

我需要使用 C++ 和纯 std(无 Boost)读取包含混合二进制和 ASCII 数据的文件。此数据通常包含嵌套的二进制和 ASCII 标头的混合,然后是二进制数据和逗号分隔的数据。数据没有很好地对齐,并且二进制标头定义了 ASCII 数据的字节数,这可能因标头而异。部分数据如下所示:

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

我发现使用read处理二进制数据和getline处理 ASCII 数据的很好的教程,我知道我可以使用 chars 逐字节读取,但我想知道你们中是否有人必须处理这种情况,并且有任何有用的建议解决这个问题的最佳方法。

4

2 回答 2

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;
}
于 2013-04-01T22:08:29.667 回答
1

唯一真正的问题是知道您在文件中的格式之间更改的位置。您必须以二进制模式打开文件(但无论如何,便携式文件通常都是这种情况)。除此之外,您必须识别何时在二进制格式(您必须实现,因为标准中没有)和文本格式之间切换。

于 2013-04-01T22:16:37.480 回答