• 读取文件的最后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;
          }
    }
  • 相关阅读:
    Lucene.net系列六 search 下
    Lucene.net 系列三 index 中
    初识Antlr
    Antlr首页计算机器实验成功
    C#语言学习之旅(1):C#基础
    NeatUpload js 判断上传文件的大小是否超过了空间的大小
    对XML的各种操作
    多表求和
    xmlhttp 最简单的无刷新
    xml 查询
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2516347.html
Copyright © 2020-2023  润新知