Как прочитать несколько файлов .txt в один буфер?

Я пытаюсь прочитать несколько текстовых файлов в один массив char * в C. Я могу выделить char * до правильного размера (то есть размеров всех суммированных текстовых файлов).

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

Я также пробовал fread, но, похоже, он перезаписывает буфер, в который он записывает, а не добавляет его в конец.

Вот мой код, большая часть из другого потока SO:

for(int i = 2; i < argc; i++) {
char *buffer = NULL;
size_t size = 0;

/* Get the buffer size */
fseek(file, 0, SEEK_END); /* Go to end of file */
size = ftell(file); /* How many bytes did we pass ? */
/* Set position of stream to the beginning */
rewind(file);
/* Allocate the buffer (no need to initialize it with calloc) */
buffer = malloc((size + 1) * sizeof(*buffer)); /* size + 1 byte for the \0 */
/* Read the file into the buffer */
fread(buffer, size, 1, file); /* Read 1 chunk of size bytes from fp into buffer */
/* NULL-terminate the buffer */
buffer[size] = '\0';

allFiles = strcat(allFiles, buffer);
free(buffer);
fclose(file);
}

Пожалуйста, помогите мне, я озадачен тем, что кажется простым делом на C. Спасибо.

# arrays
Источник
  • 2
    Нет смысла читать файлы в их собственный буфер. Просто прочтите их в единый буфер.
  • 0
    Я предполагаю, что вы каждый раз перезаписываете содержимое вместо добавления, но это сложно понять без кода.
Codelisting
за 2 против
Лучший ответ

Похоже, вы все делаете правильно, но вам нужно увеличить указатель, прежде чем передавать его вfread для следующего файла, иначе вы будете перезаписывать начало файла снова и снова.

Предполагаяbuf - правильный размер для всех файлов +1 для нулевого байта, а файлы - это массивchar * содержит имена файловNUM_FILES long, вам нужно сделать что-то вроде этого.

char *p = buf;
for(int i = 0; i < NUM_FILES; i++) {
    FILE *f = fopen(files[i], "rb");

    fseek(f, 0, SEEK_END);
    long bytes = ftell(f);
    fseek(f, 0, SEEK_SET);

    fread(p, (size_t)bytes, 1, f);
    p += bytes;

    fclose(f);
}
*p = 0;
  • 0
    в основном это имеет смысл для меня, но не могли бы вы объяснить, что в нем означают p и buf? Является ли buf единственным буфером, в который записываются все файлы, или буфером для одного файла?
  • 1
    buf - это буфер, который вы выделяете после подсчета размера всех файлов. p является указателем на этот буфер, но когда вы читаете файлы с помощью fread , вы добавляете количество прочитанных байтов к p чтобы следующий файл читался после предыдущего.
  • 0
    похоже, это должно работать, но когда я вставляю его в свой код и добавляю printf для печати buf , он все равно оказывается пустым.
  • 0
    Я хотел сказать, что напечатал p , но он все равно оказался пустым. Может я неправильно выделяю место под единственный буфер?
  • 1
    p указывает на конец buf после чтения файлов, на самый конец очень длинной строки. Распечатайте buf чтобы увидеть содержимое всех файлов.
  • 0
    Также посмотрите правку, которую я внес в код. Вам действительно следует закрыть файлы, когда вы закончите с ними.
Codelisting
Популярные категории
На заметку программисту