我有一个关于文件阅读的问题,我对此感到沮丧,因为我正在进行一些手写识别开发,而我使用的工具似乎并没有读取我的训练数据文件。
所以我有一个文件完全正常。我在这里粘贴了该文件的一些内容:
è 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
,b
,c
和d
中获得的值是85991456,-402448352,8193和2336而不是实际值。
答案 0 :(得分:0)
编译器向结构成员添加填充以使其(通常)4字节对齐。在这种情况下,填充变量c
和d
。
您应该一次从您的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]);