Использование Windows
Итак, я читаю из двоичного файла список беззнаковых значений данных int. Файл содержит несколько наборов данных, перечисленных последовательно. Вот функция для чтения одного набора данных из символа *, указывающего на его начало:
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. Что может вызвать это, совершенно непонятно для меня.