Считывает файл в буфер, затем записывает буфер в новый файл

#c

#c

Вопрос:

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

 #include <stdio.h>
#include <stdlib.h>

int main () 
{
    FILE * fileP;
    long size;
    char * buffer;
    size_t final;

    fileP= fopen ( "C:\Users\test.pdf" , "rb" );
    if (fileP==NULL) {fputs ("File error",stderr); 
    exit (1);
    }

    // calculating file size
    fseek (fileP, 0 , SEEK_END);
    size = ftell (fileP);
    rewind (fileP);

    // allocating mem for file
    buffer = (char*) malloc (sizeof(char)*size);
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

    // copying file into buffer
    final = fread (buffer,1,size,fileP);
    if (final != size) 
    {
        fputs ("Reading error",stderr); 
        exit (3);
    }
    // the whole file is now loaded in the memory buffer. 

    fclose (fileP);
    free (buffer);
    return 0;
}
  

Я знаю, что мне нужно использовать fwrite для записи содержимого буфера в новый файл, но, похоже, я не могу понять, какие параметры будут записаны в нем. Или есть какое-либо лучшее решение для этого?

Комментарии:

1. Вы будете рады услышать, что можете использовать точно такие же параметры , как в fread !

2. Вы записываете в новый файл точно так же, как вы читаете из старого файла. т.е. вы должны использовать fwrite для записи файла.

3. @RadLexus ты имеешь в виду, что fwrite будет таким? fwrite (буфер, 1, размер, файл)

4. Создайте новый файл, используя режим «w» или «wb» (скажем, fileQ), а затем запишите в него буфер с помощью fwrite(buffer,1,sizeof(buffer),fileQ).

5. что касается этой строки: buffer = (char*) malloc (sizeof(char)*size); 1) в C не приводите возвращаемое значение ни из одной функции выделения памяти кучи (malloc, calloc, realloc), поскольку оно имеет тип, void* поэтому может быть присвоено любому другому указателю. приведение просто загромождает код. 2) выражение: sizeof(char) определено в стандарте как ` и умножение на 1 не имеет никакого эффекта

Ответ №1:

Джейн,

Прежде чем вы сможете fwrite что-либо сделать, вам сначала нужно fopen получить файл назначения.

[Исходный файл] —> [Буфер памяти] —> [Файл назначения]

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

 // Open File for writing
FILE *f_dst = fopen("C:\foo.txt", "wb");
if(f_dst == NULL)
{
    printf("ERROR - Failed to open file for writingn");
    exit(1);
}

// Write Buffer
if(fwrite(buffer, 1, size, f_dst) != size)
{
    printf("ERROR - Failed to write %i bytes to filen", size);
    exit(1);
}

// Close File
fclose(f_dst);
f_dst = NULL;
  

Кроме того, я заметил в вашем коде вокруг вашей fread , вы путаете переменные ‘result’ и ‘final’ (‘result’ не существует) :

 // copying file into buffer
final = fread (buffer,1,size,fileP);
if (result != size)
  

Комментарии:

1. Да, переменная результата была использована ошибочно, теперь я отредактировал свой вопрос. Я попробую то, что вы ответили, затем прокомментирую дальше

2. Это сработало, спасибо. Однако знаете ли вы, как я могу извлечь заголовок файла .docx? @Eresse

3. @Jane, я не знаком с форматами документов Microsoft. Однако, я думаю, что ваш лучший вариант — задать это в новом вопросе.