这可能是一种非常低效的方法,但它确实有效
此代码读取一个文件,一次将 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/