使用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);
}
//...
}
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世界并不是那么有才华。可能导致这种情况对我来说完全不透明。
答案 0 :(得分:11)
您没有指定如何获取内存中的字节(由流指向),也没有指定您正在运行的平台,但是在Windows上找到您并且使用C stdio时我不会感到惊讶图书馆电话fopen(filename "r");
尝试使用fopen(filename, "rb");
。在Windows(和MS-DOS)上,fopen()将文件中的MS-DOS行结尾“\ r \ n”(十六进制0x0D 0x0A)转换为Unix样式“\ n”,除非您将“b”附加到文件模式表示二进制。
答案 1 :(得分:0)
一些无关紧要的观点。
sizeof(* dataset)不会按照您的想法执行。
每次阅读都不需要使用搜索
我不明白你是怎么调用一个只接受一个参数的函数,但是你给它两个(或者至少我不明白为什么你的编译器不反对)