理解文件格式

时间:2012-05-20 08:01:32

标签: c++ htk

我有一个关于文件阅读的问题,我对此感到沮丧,因为我正在进行一些手写识别开发,而我使用的工具似乎并没有读取我的训练数据文件。

所以我有一个文件完全正常。我在这里粘贴了该文件的一些内容:

 è      Aڈ2*A   ê“AêA mwA)àXA$NلAئ~A›إA:ozA)"ŒA%IœA&»ّAم3ACA

|®AH÷AD¢A ô-A گ&AJXAsAA mGA قQAٍALs@÷8´A

该文件采用我所知的格式,前12个字节为2个长,2个短裤,最可能的数据为4,1000,1024,9但T无法读取文件以获取这些值。

实际上我想以类似于上面提到的格式编写我的前12个字节,我似乎不知道怎么做。

忘记提及其余数据是浮点数。当我将数据写入文件时,我得到人类可读的文本而不是这些符号,当我读这些符号时,我没有得到实际的值。如何获得这些符号的实际浮点数和整数?

我的代码是

struct rec
{
    long a;
    long b ;
    short c;
    short d;
}; // this is the struct 

FILE *pFile;
struct rec my_record;

// then I read using fread

fread(&my_record,1,sizeof(my_record),pFile);`

我在abcd中获得的值是85991456,-402448352,8193和2336而不是实际值。

2 个答案:

答案 0 :(得分:0)

编译器向结构成员添加填充以使其(通常)4字节对齐。在这种情况下,填充变量cd

您应该一次从您的fread而不是您的结构中读取每个定义的数据类型。

答案 1 :(得分:0)

首先,您应该在十六进制编辑器中打开该文件,以确切地查看它包含的字节数。从您发布的文本摘录中我认为它不包含4,1000,1024和9,但是文本形式可能会非常误导,因为不同的字符编码对于相同的字节序列显示不同的字符。

如果您确认该文件包含预期数据,则可能还有其他问题。其中一个是字节序,一些机器和文件格式首先编码一个4字节long,最低有效字节,而其他字节首先读写最高有效字节。

其他问题涉及您使用的long数据类型。如果您的计算机具有64位体系结构并且您使用的是Linux,则long是64位值,并且您的结构变为20个字节而不是12个。

修改

要在像你这样的litte-endian机器上读取big-endian longs,你应该逐字节读取de data并手动构建它们的长度:

// Read 4 bytes
unsigned char buf[4];
fread(buf, 4, 1, pFile);
// Convert to long
my_record.a = (((long)buf[0]) << 24) | (((long)buf[1]) << 16) | (((long)buf[2]) << 8) | ((long)buf[3]);