2013-05-10 1 views
3

Я создаю программу архива в C, и я хочу, чтобы она сохраняла файлы, которые я предоставляю, перечисляю и извлекаю их.
У меня было много проблем, потому что я использовал текстовый файл для сохранения, и это не лучший выбор, если я хочу обрабатывать двоичные файлы, такие как музыка или фотографии, потому что, когда я их извлекаю, они выполняются неправильно (они повреждены) , Чтобы решить эту проблему, мне захотелось создать двоичный файл архива.Могу ли я использовать fgetc() или fputc() в двоичном файле?

Код для записи файла (по добыче) заключается в следующем:

void scriviFile(const char * arrivo)        //scrive i file creati in precedenza 
{ 
    FILE * partenza; 
    FILE * target; 
    int c; 
    int spazio = 'a'; 
    int i = 0; 
    int pos; 
    char * path; 
    path = collegaSlash(getcwd(NULL, 0), nome); 
    partenza = fopen(path, "rb"); 
    fseek(partenza, inizio, SEEK_SET); 
    target = fopen(arrivo, "wb");           //apro il file 
    if (target) {                //se è aperto 
     while ((c = fgetc(partenza)) != EOF && ftell(partenza)<=fine-10) {         //e il carattere preso non eccede la fine del file 
      fputc(c, target); 
      fputc(c, stdout); 
      pos = ftell(partenza); 
      if(pos==fine) 
      { 
       break; 
      } 
                      //scrivo lo stesso carattere in out (file in uscita) 
     }                 // 

     fclose(target);              //chiudo il file 
     fclose(partenza); 
    } 
    else 
    { 
     printf("errore di scrittura del file \n"); 
    } 

} 

Поскольку мне нужно двоичные файлы, которые будут извлечены правильно, я могу использовать код я писал выше, или же я должен изменить все fgetc() и fputc() Функции с fread() и fwrite()?

Благодаря

+1

Да, вы должны изменить или потратить значительное время на отладчик, чтобы обнаружить, что ваш fget получил какое-то недопустимое значение и создал havoc. – abasu

+0

Либо нет проблем при выполнении чтения, чтобы написать одно письмо, чтобы открыть двоичный файл. – BLUEPIXY

+1

@abasu О чем вы говорите? Я не вижу проблем с использованием 'fgetc' здесь. Остановите неправильную диагностику. Я вижу использование нескольких переменных, которые не объявлены. По этой причине мы не можем помочь АндреаГоттарди с этим кодом. AndreaGottardi: Создайте минимальный компилируемый тестовый файл для записи информации из структуры (которая не обязательно является «структурой») в файл. Затем создайте минимальный компилируемый тестовый файл, чтобы прочитать информацию из файла в структуру. Предоставьте оба из них здесь, но ТОЛЬКО, если они действительно скомпилируются ... Задайте вопрос о том, что вы не понимаете ... – Sebivor

ответ

8

Вы с помощью fgetc() и fputc(), как вы можете видеть из описаний человека страниц этих функций:

fgetc() считывает следующий символ из потока и возвращает его в качестве знака char, переданный в int, или EOF по окончании файла или ошибки.

fputc() записывает символ c, переданный в неподписанный символ, в поток.

Персонаж, в C, определяется стандартом, чтобы всегда быть в точности 1 байт (8 бит), то это означает, что при использовании fxxxc() на файл вы получите 1 байт (что как раз случается быть символ в текстовом файле).

Если вы извлекаете и перестраиваете двоичный файл, байт по байту, вы получите точный дубликат. Нет, нет проблем с использованием fgetc() и fputc() по двоичному типу файла. Вы всегда можете это доказать самому себе с помощью простого примера программы ... например:

int main() 
{ 
    FILE * fptr = fopen("small_pic.jpg", "rb"); // open existing binary picture 
    char buffer[10000] = {0}; // the pic is 6kb or so, so 10k bytes will hold it 
    FILE * fptr2 = fopen("new_small_pic.jpg", "wb"); // open a new binary file 
                 // for our copy of the pic 
    unsigned long fileLen; 
    unsigned long counter; 

    fseek(fptr, 0, SEEK_END); 
    fileLen=ftell(fptr);  // get the exact size of the pic 
    fseek(fptr, 0, SEEK_SET); 

    for(counter=0; counter<fileLen; counter++) 
     fputc(fgetc(fptr),fptr2); // read each byte of the small_pic.jpg and make 
              // a new pic from it 

    fclose(fptr); 
    fclose(fptr2); 
return 0; 
} 

конечного результата: у нас есть два точных одинаковых изображений, потому что fgetc() и fputc() могут быть использованы в бинарных файлах.

0

Я создаю архивную программу на C, и я хочу, чтобы она сохраняла файлы. I предоставляет, перечисляет и извлекает их. У меня было много проблем, потому что я использовал текстовый файл для сохранения, и это не лучший выбор, если я хочу, чтобы обрабатывал двоичные файлы, такие как музыка или фотографии, потому что, когда я извлекаю их , они выполнены неправильно (они повреждены). В порядке для решения этой проблемы мне захотелось создать двоичный файл архива.

--SNIP--

Поскольку мне нужно двоичные файлы, которые будут извлечены правильно, я могу использовать код я писал выше, или же я должен изменить все fgetc() и fputc() функции с FREAD() и fwrite()?

Вы можете использовать код, который вы написали выше, при работе в двоичном режиме.Это не имеет никакого отношения к fgetc, fputc, fread и fwrite. Причина, по которой эта функция не будет работать особенно хорошо при работе в текстовом режиме, заключается в том, что ftell не может быть полезен ни для чего, кроме fseek, назад к этому местоположению, поэтому код ftell(partenza)<=fine-10 не подходит для работы с файлами, открытыми в текстовый режим. Рефакторинг кода вы можете удалить ftell и работать с файлами размером более 4 ГБ в результате ... но это не должно быть единственной причиной для реорганизации этого кода.

Смежные вопросы