Таким образом, вот проблема, я читаю файл уровня для своей игры, хорошо работает в соответствии с Linux:
@0
@12
200x200 version 3
@16
973 blocks
@989
@993
18 zones
Но под окнами я получаю следующий результат:
@0
@212
200x200 version 3
@216
973 blocks
@1200
@1204
18 zones
Мм? Окна ftell статистика со смещением 200? Чтение файла, по-видимому, приводит к тем же данным, но освобожденное использование (?) значение ftell для определения, сколько байтов оставляют в файле, который может быть считан. Таким образом, конечно, я сталкиваюсь с проблемами при чтении в конце файла:
@1425
zone#9 2x3 @ 66/9
@1425
zone#10 2x3 @ 66/9
@1425
zone#11 2x3 @ 66/9
@1425
zone#12 2x3 @ 66/9
@1425
zone#13 2x3 @ 66/9
@1425
zone#14 2x3 @ 66/9
etc.
Это - соответствующий код (в настоящее время немного ужасный из-за всей печати отладки..):
void fread_all(void *ptr, size_t size, size_t count, FILE *stream) {
fread(ptr, size, count, stream);
printf("@%ld\n", ftell(stream));
}
bool map_load(struct Map *map, const char *file_name) {
FILE *fp = fopen(file_name, "r");
if (fp != NULL) {
fseek(fp, 0, SEEK_SET);
printf("@%ld\n", ftell(fp));
// Header
int *header = (int*)calloc(sizeof(int), 3);
fread_all(header, sizeof(int), 3, fp);
printf("%dx%d version %d\n", header[0], header[1], header[2]);
map->pos_x = 0;
map->pos_y = 0;
map->map_x = 0;
map->map_y = 0;
map->size_x = header[0];
map->size_y = header[1];
map_zones_remove(map);
free(header);
// Blocks
unsigned int *block_size = (unsigned int*)malloc(sizeof(unsigned int));
fread_all(block_size, sizeof(int), 1, fp);
printf("%d blocks\n", *block_size);
unsigned char *block_data = (unsigned char*)calloc(sizeof(unsigned char), *block_size);
fread_all(block_data, sizeof(unsigned char), *block_size, fp);
unsigned char *tmp = map->blocks;
map->blocks = rle_decode(block_data, *block_size);
free(tmp);
free(block_size);
free(block_data);
// Zones
int *zone_count = (int*)malloc(sizeof(int));
fread_all(zone_count, sizeof(int), 1, fp);
printf("%d zones\n", *zone_count);
int *d = (int*)calloc(sizeof(int), 6);
for(int i = 0, l = *zone_count; i < l; i++) {
fread_all(d, sizeof(int), 6, fp);
map_zone_create(map, d[0], d[1], d[2], d[3], d[4], d[5]);
printf("zone#%d %dx%d @ %d/%d\n", i, d[2], d[3], d[0], d[1]);
}
map_platforms_create(map);
free(zone_count);
free(d);
fclose(fp);
return true;
}
return false;
}
У меня действительно нет подсказки, что продолжается здесь. Компиляторы являются Visual Studio 10 один и GCC 4.4 в соответствии с Linux.
Откройте файл в двоичном режиме:
FILE *fp = fopen(file_name, "rb");
В текстовом режиме могут происходить преобразования, чтобы согласовать кодировку, например, перевода строки с кодировкой библиотеки C, зависящей от операционной системы.
ftell
и fseek
будут работать как байтовые смещения, только если вы открываете файл в двоичном режиме (например, "rb"
вместо "r"
). В противном случае вы можете fseek
только те вещи, которые ранее были возвращены ftell
; результат fseek
не будет байтовым смещением.
Двоичный режим имеет значение для окон, где текстовый режим отображает двухсимвольный возврат каретки и последовательность перевода строки в один символ новой строки. В Linux отображение не требуется.