读取文件的最后N行 问题思路来自 http://www.cnblogs.com/cobbliu/archive/2012/03/10/2388802.html
思路两个:
(1)快慢指针,和找链表倒数第K个节点有点类似。同样适用两个文件指针,fp,fs,把快的文件指针先读N行后,快慢文件指针同时一行一行的开始读取,直到快的文件指针读到文件最后,则慢的文件指针此时读到文件的倒数第N行,就可以开始数数慢的文件指针的内容直到读取文件结束。
1 void PrintfFileN(string filename,int n){ 2 File* fp,*fs; 3 int i; 4 char fpline[MAXLINE]; 5 char fsline[MAXLINE]; 6 if((fp = fopen(filename,"r")) == NULL) 7 { 8 fprintf(stderr,"Cannot open file:%s/n",filename); 9 exit(-1); 10 } 11 12 if((fs = fopen(filename,"r")) == NULL) 13 { 14 fprintf(stderr,"Cannot open file:%s/n",filename); 15 exit(-1); 16 } 17 18 for(i = 1;i <= n; i++) 19 fgets(fpline,MAXLEN,fp); //先将fp移动n个位置 20 21 while(fgets(fpline,MAXLEN,fp) != NULL) 22 fgets(fsline,MAXLEN,fs); //将fp与fq一起向尾部移动,直到fp指向末尾 23 24 //此时fq指向倒数第n行 25 while(fgets(fsline,MAXLEN,fs) != NULL) 26 printf("%s",fsline); //输出从fq开始的每一行 27 }
(2)利用循环链表,长度为n,节点的data为char型数组,用来保存一行的内容
思路,打开文件,读取一行,拷贝到循环链表当前指针所指的节点中,然后把链表指针后移,重复读取,拷贝,结束后,链表中保存了N个,就是最后的
算法:
typedef struct Node{ char Data[MAXLINE]; struct Node * next; }Node; void PrintfFileN(string filename,int N){ Node* list=NULL,*p=NULL,*temp; char fileData[MAXLINE]; File* pFile; int i=0; while(i<N){//建个一个头结点是list的长度为N的链表 if(list==NULL){ list=p=(Node*)malloc(sizeof(Node)); list->Data[0]='\0'; list->next=NULL; i++; }else{ temp= (Node*)malloc(sizeof(Node)); temp->data[0]='\0'; temp->next=NULL; p->next=temp; p=temp; i++; } } p->next=list;//循环链表 p=list; pFile=fopen(filename,"r"); while(gets(fileData,MAXLINE,pFile)!=NULL){ strcpy(p->Data,fileData); p=p->next; } for(i=0;i<N;i++){ temp=p->next; printf("%s",p->data); free(p); p=temp; } }