如何将多个.txt文件读入单个缓冲区?

时间:2019-04-30 20:48:54

标签: c arrays

我正在尝试将多个文本文件读入C中的单个char *数组中。我可以尽最大可能将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语言看似简单的事情感到困惑。谢谢。

1 个答案:

答案 0 :(得分:2)

听起来好像您所做的一切都正确,但是在将指针传递给下一个文件的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;