从文件缓冲一组行并将其存储在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("%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行的地址

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

你有一个陈旧的指针,我将在这里解释

 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 

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

 array_buffer[count] = line_char; 

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

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

 void line(char *line_char){ if (count == 8){ int row,col; for(row = 0; row