1

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

此代码读取文件,一次将 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]

all指向第8行的地址

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

4

3 回答 3

2

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

array_buffer[count] = line_char;

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

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

于 2013-07-05T14:59:21.330 回答
2
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("%d\n", count);
    count++;
}
于 2013-07-05T15:39:47.737 回答
1

你有一个过时的指针,我会在这里解释

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]);
}
于 2013-07-05T15:01:27.673 回答