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



这可能是一种效率很低的方法,但它的工作方式是

这段代码读取一个文件,在一个全局数组中一次存储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("%dn",count);
    if (count == 8)
    {
        int row,col;
        for(row = 0; row<count; row++){
            printf("%dn",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;

在所有八个位置放置指向来自CCD_ 2的相同CCD_。随后对fgets的调用会覆盖以前读取的内容,因此最后会得到最后一行的八个副本。

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

void line(char *line_char){
    if (count == 8){
        int row,col;
        for(row = 0; row<count; row++){
            printf("%2d:",row);
            printf("%s", array_buffer[row]);
            free(array_buffer[row]);
        }
        count = 0;
    }
    int lent = strlen(line_char);
    array_buffer[count] = malloc((lent + 1)*sizeof(char));
    strcpy(array_buffer[count], line_char);
    //printf("%dn", count);
    count++;
}

您有一个过时的指针,我将在这里解释

while (fgets(buff, 512, fp) != NULL )
{
    //buff updated
    line(buff);
    //...
    //inside of the line function
        somepointertopointers[currIndex]=buff;

现在它在buff中查看位置,所以所有元素都在同一个位置,你需要复制字符,或者制作一个更长的缓冲区,并确保你正在更新指针正在查看的位置,你可以制作8个单独的char[]指针以及

这将给你想要的结果

buff[512][8];
char** curr = buff;
while(fget(*curr,512,fp)!= NULL)
{
     line(*curr);
     curr++;
}

或者,您可以分配通过的缓冲区

#def BUFF_SIZE 512
#def BUFF_ARRAY_LEN 8

//put this somewhere before calling line 
//to initialize your array_buffer
for(i=0;i<BUFF_ARRAY_LEN;i++)
{
    array_buffer[i]=NULL;
}
...
//update in function line
//makes more sense to just use 
//the max len of a line
if(array_buffer[count] == NULL)
    array_buffer[count]=(char*)malloc(sizeof(char)*BUFF_SIZE);
strcpy(array_buffer[count],line_char);
...
//you will also need to
//clean up after you are 
//done with the memory
for(i=0;i<BUFF_ARRAY_LEN;i++)
{
    free(array_buffer[i]);
}

最新更新