Возможно, размеры unsigned long
на машинах не одинаковы.
Что печатает следующая программа на ваших машинах?
#include <stdio.h>
int main(void)
{
printf("%zu\n", sizeof(unsigned long));
return 0;
}
Компилировать с gcc -std=c99 file.c
. Если напечатанные размеры действительно отличаются, то вам нужно заменить unsigned long
на uint32_t
и добавить #include <inttypes.h>
в начале вашей программы:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <stdint.h>
int main(int argc, char **argv)
{
long offset;
FILE *io;
unsigned char found;
uint32_t loc;
if (argc != 2)
{
printf("syntax: find 0000000\n");
return 255;
}
/* sizeof(unsigned char) is 1, and I am assuming you wanted
sizeof(unsigned long) to be 4. But see below. */
offset = strtol(argv[1], NULL, 0) * (1+4);
if ((io = fopen("index.dat", "rb")) == NULL) {
fprintf(stderr, "Cannot open file\n");
return EXIT_FAILURE;
}
if (fseek(io, offset, SEEK_SET) == -1) {
fprintf(stderr, "Error seeking\n");
perror(NULL);
return EXIT_FAILURE;
}
if (fread(&found, 1, 1, io) != 1) {
fprintf(stderr, "Error in first fread\n");
return EXIT_FAILURE;
}
/* using sizeof loc makes sure that the correct size if always used,
irrespective of the type of loc */
if (fread(&loc, sizeof loc, 1, io) != 1) {
fprintf(stderr, "Error in second fread\n");
return EXIT_FAILURE;
}
if (found == 1)
printf("%" PRIu32 "\n", loc);
else
printf("-1\n");
fclose(io);
return 0;
}
Выше предполагается, что "правильно работающая" программа имеет 4 байта unsigned long
. Если нет, вам нужно заменить 4
в программе на любой размер unsigned long
на правильном компьютере.
Если это является причиной разницы, то теперь вы знаете одну из проблем с чтением и записью двоичных данных: вы должны быть очень осторожны с размерами, порядком байтов и т.д.