fread завершает чтение в середине чтения при нулевых значениях.Также чтение в мусоре прошлых ожидаемых данных

StackOverflow https://stackoverflow.com/questions/1541676

Вопрос

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

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

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

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

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

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

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

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

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

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

ýýýý««««««««îþ

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

Это было полезно?

Решение

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

fread(data, 1, m_sizeOfData, fp);

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top