Скопировать часть файла в C ++ - PullRequest
0 голосов
/ 01 октября 2011

В настоящее время я занят проектом, в котором мне нужно скопировать деталь из файла в другой файл, поэтому я сделал код для этого, используя fread и fwrite. Но я столкнулся с проблемой: для целей тестирования я создал код, который должен копировать весь файл, но каким-то образом код создает копии, которые больше исходного файла. Смотрите код, который я сделал ниже

             FILE *base_file;
             FILE *new_file;
             fpos_t curpos;
             int tmp;

             // Open the base file
             fopen_s(&base_file, "C:/base.dat", "rb");
             // Open the file which should contain the copy
             fopen_s(&new_file, "C:/new.dat", "w");

             // Get the filesize
             fseek(base_file, 0, SEEK_END);
             fgetpos(base_file, &curpos);
             fseek(base_file, 0, SEEK_SET);

             //Read and copy (it seems to go wrong here)
             for(int i = 0; i < curpos; i++){
                 fread (&tmp, 1, 1, base_file);
                 fwrite(&tmp, 1, 1, new_file);
             }

             fclose(base_file);
             fclose(new_file);

Базовый файл составляет 525 КБ, а новый файл - 527 КБ. Насколько я мог видеть, части, где возникает эта проблема, следуют за частями, в которых есть 7 нуль-байтов, и копия как-то добавила «0D» (в шестнадцатеричном формате) после этих частей. В ascii символ «0D» - это «возврат каретки». Мне было интересно, что может быть причиной того, что мой код копии добавляет возврат каретки в файл? Насколько я знаю, этот скрипт должен просто работать, поскольку я просто читаю базовый файл и напрямую копирую его в новый файл, а базовый файл не содержит этих возвратов каретки.

Ответы [ 2 ]

5 голосов
/ 01 октября 2011

Вы открываете файл назначения в текстовом режиме, а не в двоичном, поэтому перевод новой строки происходит за вашей спиной. Измените режим на "wb".

Другие примечания:

  1. Используйте потоки вместо stdio.
  2. Не пишите побайтово. Используйте больший буфер, ваш метод будет длиться вечно для больших файлов.
2 голосов
/ 01 октября 2011

Исправит ли это "wb" вместо "w"?

...