Как прочитать несколько файлов .txt в один буфер? - PullRequest
0 голосов
/ 30 апреля 2019

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

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

Я также пробовал использовать 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. Спасибо.

1 Ответ

2 голосов
/ 30 апреля 2019

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

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...