这可能是一种效率很低的方法,但它的工作方式是
这段代码读取一个文件,在一个全局数组中一次存储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]);
}