您的位置:首页 > 理论基础 > 计算机网络

读取文件的最后N行 问题思路来自 http://www.cnblogs.com/cobbliu/archive/2012/03/10/2388802.html

2012-05-24 12:35 357 查看
思路两个:

(1)快慢指针,和找链表倒数第K个节点有点类似。同样适用两个文件指针,fp,fs,把快的文件指针先读N行后,快慢文件指针同时一行一行的开始读取,直到快的文件指针读到文件最后,则慢的文件指针此时读到文件的倒数第N行,就可以开始数数慢的文件指针的内容直到读取文件结束。

void PrintfFileN(string filename,int n){
File* fp,*fs;
int i;
char fpline[MAXLINE];
char fsline[MAXLINE];
if((fp = fopen(filename,"r")) == NULL)
{
fprintf(stderr,"Cannot open file:%s/n",filename);
exit(-1);
}

if((fs = fopen(filename,"r")) == NULL)
{
fprintf(stderr,"Cannot open file:%s/n",filename);
exit(-1);
}

for(i = 1;i <= n; i++)
fgets(fpline,MAXLEN,fp);         //先将fp移动n个位置

while(fgets(fpline,MAXLEN,fp) != NULL)
fgets(fsline,MAXLEN,fs);        //将fp与fq一起向尾部移动,直到fp指向末尾

//此时fq指向倒数第n行
while(fgets(fsline,MAXLEN,fs) != NULL)
printf("%s",fsline);            //输出从fq开始的每一行
}


(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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐