c - 缓冲文件中的一组行并将其存储在 C 中的数组中

标签 c arrays string buffer

这可能是一种非常低效的方法,但它确实有效

此代码读取一个文件,一次将 8 行文本存储在全局数组中(如果可能,希望有更好的选择)并进行调度以进行进一步处理。

这是代码

int count = 0;             //global
char *array_buffer[8];     //global

void line(char *line_char)
{

    int lent = strlen(line_char);
    array_buffer[count] = line_char;

    printf("%d\n",count);

    if (count == 8)
    {

        int row,col;
        for(row = 0; row<count; row++){
            printf("%d\n",row);
            for(col = 0; col<=lent; col++) {
                printf("%c", array_buffer[row][col]);
            }
        printf("\n");   
        }
    count = 0;
    }

    count++;
}



int main(int argc,char **argv)
{

    clock_t start = clock();

    FILE *fp = fopen(argv[1], "r");
    if(fp == NULL )
    {
        printf("Couldn't open file %s",argv[1]);
    }
    char buff[512];

    while (fgets(buff, 512, fp) != NULL )
    {
        line(buff);             /*sending out an array having one line*/
    }

    return 0;
}

问题在于,在打印出 array_buffer 的内容时,它打印出了缓冲区中的最后一行 8 次。 (即每个周期的第 8 行读数)。很明显

array_buff[0]
....
array_buff[7]

都指向第8行的地址

对解决这个问题有帮助吗?我知道这可能根本不是缓冲某些东西的正确方法!

最佳答案

导致您看到的行为的方法问题是您的代码从不从缓冲区复制数据。这条线

array_buffer[count] = line_char;

在所有八个位置放置一个指向来自 main 的相同 char buff[512] 的指针。对 fgets 的后续调用会覆盖之前读取的内容,因此您最终会得到最后一行的八个副本。

您可以通过制作副本来解决此问题,例如使用 strdup 或使用 malloc 分配内存并制作副本。不过,您需要释放您分配的所有内容。

关于c - 缓冲文件中的一组行并将其存储在 C 中的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17491732/

相关文章:

c - 有没有办法让我的补充代码更加高效并允许一次多个输出?

c - 将动态数组传递给c中的函数

c# - 键值对列表

javascript - 如何将这个 ruby​​ 字符串转换为普通数组?

c - 编写一个程序以继续处理整数直到素数

c - OpenMP 和 C 并行 for 循环 : why does my code slow down when using OpenMP?

javascript - 在 Express 中将数组传递给 Jade/Pug 路由

Java String.format args索引不一致

C++ Builder 允许将字符串与 Int 进行比较 - 为什么?

ruby-on-rails - Rails file_field 标记仅将字符串文件名传递给 Controller