Пользовательский формат архива Чтение файлов - PullRequest
3 голосов
/ 20 сентября 2011

C # .NET 4.0

У меня возникла интересная проблема с чтением нестандартного формата файлового архива.В C # я написал программу, которая создает заголовок архива (некоторая дополнительная информация об архиве в целом, количестве файлов и тому подобное).Затем он принимает входной файл для хранения, читает и байтов, а затем записывает некоторые служебные данные о файле (имя файла, тип, размер и т. Д.), А затем фактические данные файла.Я также могу извлечь файлы из архива через эту программу.Чтобы проверить его, я сохранил изображение в формате png и извлек его, считав размер файла из служебной информации, а затем выделив массив байтов такого размера, извлек файловые данные в этот массив и затем записал его с помощью потокового редактора.Ничего страшного, работал нормально.Теперь перейдем к стороне C ++ ...

C ++

Моя программа на C ++ должна прочитать данные файла, определить тип файла и затем передать ихсоответствующий класс обработки.Классы обработки давали ошибки, которых у них быть не должно.Поэтому я решил выписать данные файла из программы на C ++ после прочтения с помощью fwrite (), и полученный файл оказался поврежденным?В двух словах, это код, который используется для чтения файла ...

unsigned char * data = 0;
char temp = 0;
__int64 fileSize = 0;
fread(&fileSize, sizeof(__int64), 1, _fileHandle);
data = new unsigned char[fileSize];

for (__int64 i = 0; i < fileSize; i++)
{
    fread(&temp, 1, 1, _fileHandle);
    data[i] = temp;
}

(Я сейчас на работе, поэтому я просто написал это по памяти. Однако я на 99%положительно, это точно для моего кода дома. Сейчас меня тоже не интересуют стандарты MS, поэтому, пожалуйста, имейте в виду __int64.)

Я не прошел все 300 с лишним тысяч байт, чтобы определитьесли все соответствует, но первые 20 или около того байтов, на которые я смотрел, кажутся правильными.Я не совсем понимаю, почему есть проблема.Есть ли что-то смешное в fread ()?Я также дважды проверил файл в архиве, удалил все служебные данные архива и сохранил только данные изображения в новое изображение png с помощью блокнота, который работал нормально.

Должен ли я читать это по-другому?Что-то не так с использованием fread () для чтения этих данных?

1 Ответ

2 голосов
/ 20 сентября 2011

Учитывая, что первые n байты кажутся правильными, вы случайно забыли открыть файл в двоичном режиме ("rb")? Если вы этого не сделаете, то это полезно конвертировать любые последовательности \r\n в \n для вас, что, очевидно, не будет тем, что вы хотите.

Поскольку этот вопрос помечен как C ++, вы рассматривали возможность использования канонического подхода C ++ для iostreams, а не несколько устаревших потоков FILE* из C?

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