c strcpy файловый дескриптор - PullRequest
0 голосов
/ 11 января 2011

У меня вопрос с функцией strcpy (). Я пытаюсь сделать так, чтобы пользователь вводил имя файла, и я в основном открывал файл, получал содержимое и создавал копию файла.

Однако я решил выполнить некоторую проверку на наличие ошибок, чтобы проверить, совпадает ли содержимое read () с содержимым, записанным в файле копии, перед записью. Итак, я считал () содержимое в динамический массив, используя размер файла для чтения файла, поэтому буфер является правильным размером для данных. Затем я хочу создать копию этого в другом динамическом буфере и использовать strcmp (), чтобы увидеть, совпадают ли они, если да, то я записываю буфер копирования в выходной файл?

Это работает нормально для определенных файлов, но проблема с видеофайлами (mpeg) и т. Д., При открытии видеофайла выдается ошибка «Не удалось определить тип потока», вот идея

char* buffer1 = malloc(filessize);
char* buffer2 = malloc(filessize);
read(file, buffer1, filesize);
strcpy(buffer2, buffer1); //copy buffer1 into buffer2
if(strcmp(buffer1, buffer2) == 0)
{
  write(outputfile, buffer2, filesize); //write copied buffer to file
}
free(buffer1); free(buffer2);

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

Ответы [ 2 ]

6 голосов
/ 11 января 2011

strcpy и strcmp предназначены для строк C, которые заканчиваются на 0.Если ваши видеофайлы имеют какой-либо байт со значением 0, они сразу же остановятся.

Вместо этого вы должны смотреть memcpy и memcmp, что не будет интерпретировать ваши буферы как 0 завершенных строк.

1 голос
/ 11 января 2011

Вместо этого вы должны использовать memcpy, поскольку strcpy будет копировать только до первого символа '\ 0'. Это плохо работает для двоичных файлов. Реальный вопрос заключается в том, почему вы хотите скопировать содержимое файла в память, хотя ... Вы можете просто записать оригинальный буфер в новый файл.

...