0

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

所以我有一个文件可以正常工作。我在此处粘贴该文件的一些内容:

 è      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);`

a我在、和中得到的值是 85991456、-402448352、8193 和 2336,而不是实际值bcd

4

2 回答 2

0

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

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

于 2012-05-20T08:09:06.200 回答
0

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

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

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

编辑:

要在像您这样的 litte-endian 机器上读取 big-endian long,您应该逐字节读取数据并手动构建 long:

// 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]);
于 2012-05-20T08:17:38.173 回答