#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. Однако, я думаю, что ваш лучший вариант — задать это в новом вопросе.