2009-10-21 69 views
2

使用Windows什么会导致Labwindows/CVI C程序讨厌2573号码?

所以我从二进制文件读取一个无符号整型数据值列表。该文件包含多个按顺序列出的数据集。下面就来读取一个char *指向一个单一的数据集,以它的启动功能:

function read_dataset(char* stream, t_dataset *dataset){ 

    //...some init, including setting dataset->size; 

    for(i=0;i<dataset->size;i++){ 
     dataset->samples[i] = *((unsigned int *) stream); 
     stream += sizeof(unsigned int); 
    } 
    //... 
} 

凡read_dataset在这样的背景下,因为这:

//... 
char buff[10000]; 
t_dataset* dataset = malloc(sizeof(*dataset)); 
unsigned long offset = 0; 

for(i=0;i<number_of_datasets; i++){ 

    fseek(fd_in, offset, SEEK_SET); 

    if((n = fread(buff, sizeof(char), sizeof(*dataset), fd_in)) != sizeof(*dataset)){ 
     break; 
    } 

    read_dataset(buff, *dataset); 

    // Do something with dataset here. It's screwed up before this, I checked. 


    offset += profileSize; 
} 
//... 

一切顺利顺顺当当,直到我的循环读取号码2573.突然间,它开始吐出随机的和巨大的数字。

例如,应该是什么

... 
1831 
2229 
2406 
2637 
2609 
2573 
2523 
2247 
... 

成为

... 
1831 
2229 
2406 
2637 
2609 
0xDB00000A 
0xC7000009 
0xB2000008 
... 

如果你觉得这些十六进制数字看起来很可疑,你说得对。原来的十六进制值发生了变化,该值是真正熟悉:

2573 -> 0xA0D 
2523 -> 0x9DB 
2247 -> 0x8C7 

因此很明显,这个数字2573使我流指针,以获得一个字节。直到下一个数据集被加载和解析,并且上帝禁止它包含数字2573.我检查了发生这种情况的一些点,并且我检查过的每一个点始于2573.

我承认我'在C的世界中并非如此有才华,这可能对我来说是完全不透明的。

回答

11

你不指定你如何获得内存中的字节(指向流),也不是你在哪个平台上运行,但我不会惊讶地发现你的Windows,并且您使用C stdio库调用fopen(filename "r");尝试使用fopen(filename, "rb");。在Windows(和MS-DOS)上,fopen()将文件中的MS-DOS行结尾“\ r \ n”(十六进制0x0D​​ 0x0A)转换为Unix样式“\ n”,除非将“b”附加到文件模式表示二进制。

+0

好点(做得好 - 为了让它达到15个字符!) – 2009-10-21 22:13:17

+0

谢谢你,先生,我明白我的方式错误(是的,我忘了“b”)。 – 2009-10-21 22:20:34

+0

我以前常常忘记了“b”,并认出了症状。 – 2009-10-21 22:33:17

0

一些无关紧要的问题。

sizeof(* dataset)不会做你认为它做的事。

没有必要使用寻求每一个阅读

我不明白你是如何调用一个函数,只需要一个参数,但你给了它两个(或至少我不明白为什么你的编译器不会反对)

+0

我可能会咬嘴,但我确实在代码中留下了一些东西。每个数据集都包含一个小标题,表示样本数量,这在文件之间不一致。因此,t_dataset是我期望遇到的最大数据集的大小。这可能是错误的,但在我的辩护中,我没有写这个。 因此,fseek补偿过冲。 – 2009-10-21 22:19:08