fread оканчивается в середине чтения при нулевых значениях. Также чтение мусора мимо ожидаемых данных - PullRequest
0 голосов
/ 09 октября 2009

Я читаю по частям двоичного файла, используя объект FILE в C ++. Вот fseek и соответствующий вызов fread:

fseek(fp, startLocation, SEEK_SET);
fread(data, m_sizeOfData, 1, fp);

m_sizeOfData является целым числом, превышающим 400 тысяч. Похоже, что он должен прочитать все 400 тысяч байт из двоичного файла в данные (кстати, это char [m_sizeOfData]), однако он останавливается после 6 или 7 символов в символе Unicode, который просто выглядит как блок. Я думаю, что это может означать нулевое завершение? Я не уверен в этом. Это не относится к каждому фрагменту файла, в котором я читаю. Большинство из них, кажется, работают (в целом) правильно.

Почему это может быть и есть ли способ правильно прочитать все данные?

Редактировать

fp определяется так:

FILE* fp;
_wfopen_s(&fp, L"C://somedata.dat", L"rb");

Этот символ в шестнадцатеричном формате - 0x06, за которым следует 0x00.
Данные определяются следующим образом: char * data = new char [m_sizeOfData];

редактировать 2 :

Я также заметил, что в другой файл загружен какой-то мусор. Мусор выглядит так:

YYYY «« «« «« «« МТД

Это потому, что он пытается завершить определенное количество байтов?

Ответы [ 3 ]

1 голос
/ 09 октября 2009

Вы используете неверные параметры подсчета / размера фреда. Поскольку вы читаете байты, вторым параметром должно быть 1, а третьим параметром - количество:

fread(data, 1, m_sizeOfData, fp);

Затем вы можете использовать возвращаемое значение fread, чтобы определить, сколько байтов было прочитано. Если вы получаете ожидаемое возвращаемое количество, тогда вы можете быть уверены, что вы читаете все данные, которые вы хотели. В этом случае вы, вероятно, выводите данные неправильно - если вы обрабатываете их как строку с нулевым символом в конце, то 0x00, который вы видите, будет концом напечатанного. 0x06 - это, вероятно, глиф коробки.

1 голос
/ 09 октября 2009

Откуда ты знаешь, что это останавливается, где ты говоришь? Если вы просто смотрите на результат с помощью строковых функций, все эти строковые функции будут останавливаться на первом нулевом символе - фактические данные могут значительно расшириться.

0 голосов
/ 09 октября 2009

Если вы находитесь в Windows, я думаю, что есть некоторые символы, такие как ctrl-Z или ctrl-D, которые могут обозначать конец файла, если вы специально не открываете файл в двоичном режиме

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