Получение нулей между данными при чтении двоичного файла в C - PullRequest
0 голосов
/ 16 января 2011

У меня есть двоичные данные, которые я читаю в массив длинных целых чисел, используя программу на Си.

Шестнадцатеричная последовательность двоичных данных показывает, что после первых нескольких точек данных она начинается снова с местоположения в 20000 шестнадцатеричных адресов. Вывод hexdump такой, как показано ниже.

0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0020000 0000 0000 0053 0000 0064 0000 006b 0000
0020010 0066 0000 0068 0000 0066 0000 005d 0000
0020020 0087 0000 0059 0000 0062 0000 0066 0000

... и так далее ... Но когда я читаю его в массив данных из длинных целых чисел с помощью типичной команды fread

fread(data,sizeof(*data),filelength/sizeof(*data),fd);

Он заполняется всеми нулями в моем массиве данных, пока не достигнет местоположения 20000. После этого он правильно читает данные. Почему он читает регионы, где моего файла нет? Или как мне сделать так, чтобы он читал только мой файл, а не то, что находится между файлами, которых нет в файле?

Я знаю, что это выглядит тривиальной проблемой, но я не могу понять это даже после того, как однажды вечером Гуглил. Кто-нибудь может подсказать, где я делаю это неправильно?

Другая информация: я работаю на машине с GNU / Linux. (Slax-Atma Distro, чтобы быть конкретным). Мой компилятор Си gcc.

Ответы [ 2 ]

5 голосов
/ 16 января 2011

Вывод шестнадцатеричного дампа показывает, что первая строка (16 байт) данных - все нули;«*» означает, что следующие строки одинаковы, пока вы не достигнете смещения 0x0020000.Итак, начало вашего файла - все нули.

Вызов read читает файл так, как если бы на диске присутствовали нули, потому что для этого определен интерфейс Unix / Linux.Хранятся ли они на диске или нет, не имеет значения;что касается вашей программы, они там есть.

Если вы хотите пропустить часть файла с «всеми нулями», то желательно не записывать файл со всеми нулями в начале.В противном случае вам придется решить, как читать данные порциями, пока вы не начнете находить ненулевую информацию - или использовать фиксированное смещение для перехода через нули.

Итак, абстракция файловой системы в Unixа Linux означает, что нули читаются независимо от того, хранятся они физически на диске или нет.Чтобы их пропустить, вы должны знать, как вы хотите это сделать - либо узнав, сколько их существует, и ища мимо них, либо читая и отбрасывая данные.

2 голосов
/ 16 января 2011

Вы спрашиваете: «Почему он читает регионы, где моего файла нет?»

Но вы не правы. Нули являются действительными данными в файле. Так что он читает эти нули. Он ведет себя правильно.

Если вы хотите пропустить нули, вам нужно перечитать одно число за другим и пропустить его, если оно равно нулю. Вы также можете прочитать весь набор данных в память, а затем сжать его (который требует больше памяти, но быстрее, чем читать числа один за другим с диска).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...