如果是做作业的孩子找到了这里,希望不要直接copy,供参考,其实我做的也不一定好嘻嘻。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<fcntl.h>
#define BUFFERSIZE 512
char *file;
int getRows(){
int chars,i,rows=0,fd;
char buf[BUFFERSIZE];
fd=open(file,O_RDONLY);
if(fd==-1)
return -1;
while((chars = read(fd, buf, BUFFERSIZE)) > 0){
i=0;
while(i<chars){
if(buf[i]=='\n')
rows++;
i++;
}
}
close(fd);
return rows;
}
int toInt(char *str){
int res=0;
int now=1;
int len=strlen(str);
int i=len-1;
while(i>=0){
res=res+(int)(str[i]-'0')*now;
now*=10;
i--;
if(i==0 && str[i]=='-'){
return res;
}
}
return res;
}
int isValid(char *str){
int len = strlen(str);
int i=0;
if(len>=2 && str[0]=='-') i=1;
for(;i<len;i++){
if(str[i]<='0' || str[i] >= '9')
return -1;
}
return 1;
}
void readFile(int isOk,int allRows,int num){
int chars;
char buf[BUFFERSIZE];
int i,cur=0;
int fd=open(file,O_RDONLY);
if(isOk==1){
while((chars = read(fd, buf, BUFFERSIZE))>0){
i=0;
while(i<chars){
if(cur>=(allRows - num)){
printf("%c",buf[i]);
}
if(buf[i]=='\n'){
cur++;
}
i++;
}
}
close(fd);
}
}
int main(int argc,char **argv){
int ch,fd,cur;
int num=10,isOk=1;
int allRows;
long time1,time2;
struct stat buf;
file = (char*)malloc(100*(sizeof(char)));
if(argc==1){
strcpy(file,"a.txt");
} else if(argc==2 && strcmp(argv[1],"-n")==0){
printf("Please input like -n [number] [filename]\n");
return;
} else if(argc==2 && strcmp(argv[1],"-n")!=0){
strcpy(file,argv[1]);
}else if(argc==4){
strcpy(file,argv[3]);
} else {
printf("Please input like [filename] / -n [number] [filename]\n");
return;
}
allRows = getRows();
if(allRows == -1){
printf("File not exists\n");
return;
}
if(allRows < 10){
num = allRows;
}
while((ch = getopt(argc, argv,"n:f::"))!=EOF){
switch(ch){
case 'n':
if(isValid(optarg)==-1){
printf("The option 'n' is not valid.\n");
isOk = 0;
break;
}
num=toInt(optarg);
if(num > allRows || num==0){
printf("The option 'n' is over the max rows\n");
isOk = 0;
break;
}
break;
case '?':isOk=0;break;
default:break;
}
}
readFile(isOk,allRows,num);
}