Чтение и запись файла со специальными символами в c - PullRequest
2 голосов
/ 05 января 2012

Используя язык C, я пытаюсь манипулировать некоторыми файлами, сгенерированными openssl и содержащими много (очень) специальных символов.Но конец файла, кажется, обнаружен преждевременно.Например, см. Выдержку из моей программы, которая должна копировать файл в другую:

(по причинам простоты я не показываю тест открытия файла, но я делаю это в своей программе)

char msgcrypt[FFILE];
FILE* fMsg = fopen(f4Path,"r");
while(fgets(tmp,FFILE,fMsg) != NULL) strcat(msgcrypt,tmp);
fclose(fMsg);
FILE* fMsg2 = fopen(f5Path,"w");
fprintf(fMsg2,"%s",msgcrypt);
fclose(fMsg2);

вот содержимое файла, расположенного в f4Path:

Salted__X¢~xÁïÈú™xe^„fl¯�˜<åD

теперь содержимое файла, расположенного в f5Path:

Salted__X¢~xÁïÈú™xe^„fl¯

Обратите внимание, что 4символы отсутствуют.

У кого-нибудь есть идеи?

Ответы [ 3 ]

5 голосов
/ 05 января 2012

Но конец файла обнаружен преждевременно

Звучит знакомо.

  • Используйте fopen(f4Path, "rb") при открытии файла. Это имеет реальное значение для Windows.
  • Не используйте строковые функции (fprintf, strcat, fgets и т. Д.), Они будут подавлять символы NUL Вместо этого используйте fread и fwrite.
1 голос
/ 05 января 2012

strcat пытается скопировать нулевое значение char *. Это означает, что если он встретит 0, что он, вероятно, сделал здесь, он прекратит копирование.

Вам лучше использовать open read, memcpy и write.

0 голосов
/ 05 января 2012

Этот символ, на котором он останавливается, я скопировал в шестнадцатеричный редактор, и в конечном итоге он становится EF BF BD, спецификацией, если я не ошибаюсь.В результате чтение файла как текстового файла не удается.Я не вижу никаких символов NULL (если только копирование и вставка не избавили от них).

Ответ (как уже обсуждалось) состоит в том, чтобы не обрабатывать его как текстовый файл и избегать выигранных функций str.Также не навреди.

Первое, что я хотел бы сделать, - это добавить проверку того, как могут читаться символы, чтобы вы знали, где обрезаются данные.Прямо сейчас это может быть любым из: read, strcat, write.

...