什么可能导致Labwindows/CVI C程序讨厌2573号?

Ada*_*ard 3 c memory labwindows cvi

使用Windows

所以我从二进制文件中读取一个unsigned int数据值列表.该文件包含按顺序列出的许多数据集.这是从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);
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

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;
}
//...
Run Code Online (Sandbox Code Playgroud)

一切都顺其自然,直到我的循环读取数字2573.突然间它开始吐出随机和大量的数字.

例如,应该是什么

...
1831
2229
2406
2637
2609
2573
2523
2247
...
Run Code Online (Sandbox Code Playgroud)

...
1831
2229
2406
2637
2609
0xDB00000A
0xC7000009
0xB2000008
...
Run Code Online (Sandbox Code Playgroud)

如果您认为这些十六进制数字看起来很可疑,那么您是对的.结果显示已更改的值的十六进制值非常熟悉:

2573 -> 0xA0D
2523 -> 0x9DB
2247 -> 0x8C7
Run Code Online (Sandbox Code Playgroud)

显然这个数字2573导致我的流指针获得一个字节.这一直存在,直到下一个数据集被加载和解析,并且上帝禁止它包含一个数字2573.我已经检查了许多发生这种情况的地方,我检查过的每一个都开始于2573年.

我承认我在C世界并不是那么有才华.可能导致这一点对我来说完全不透明.

Ste*_*eel 11

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