读取文件的最后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;
      }
}

转载于:https://www.cnblogs.com/GoAhead/archive/2012/05/24/2516347.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值