问题背景: 无论是实时视频监控还是直播点播等应用场景,最起码的一个操作就是播放视频。其中最基本的思路就是利用OS的API在PC开发桌面应用、在移动端开发Native App,目前这种技术已经成熟,大厂
顺晟科技
2022-09-15 21:10:29
37
思路两个:
(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;
}
}
15
2022-09
15
2022-09
15
2022-09
23
2021-10
21
2021-09
17
2021-09