实现tail
编程之路刚刚开始,错误难免,希望大家能够指出。
自己实现一个tail的功能(使用IO系统调用),完全类似的操作步骤就不实现了,主要是让自己加深了解。
下面的代码不足之处很多,以后有空改正。
1 #include2 #include <string.h> 3 #include 4 #include 5 #include 6 7 #define BUF_SIZE 1024 8 9 int GetFileLine(int fd) 10 { 11 int iLine = 0; 12 char czBuf[BUF_SIZE+1] = {0}; 13 while(1) 14 { 15 memset(czBuf,0,BUF_SIZE+1); 16 int ret = read(fd,czBuf,BUF_SIZE); 17 if(ret < 0) 18 { 19 perror("read"); 20 return -1; 21 } 22 else if(ret == 0) 23 { 24 break; 25 } 26 else 27 { 28 for(int index = 0;index < BUF_SIZE;index++) 29 { 30 if(czBuf[index] == '\n') 31 { 32 iLine++; 33 } 34 } 35 } 36 } 37 38 int ret = lseek(fd,0,SEEK_SET); 39 if(ret < 0) 40 { 41 perror("lseek"); 42 return -2; 43 } 44 45 return iLine; 46 } 47 48 int myTail(int fd,int line) 49 { 50 int iLine = GetFileLine(fd); 51 int ret = -1; 52 char czBuf[BUF_SIZE+1] = {0}; 53 if(iLine < 0) 54 { 55 return -1; 56 } 57 58 if(line < iLine) 59 { 60 int iStartLine = iLine - line - 1; 61 int iCurLine = 0; 62 int flag = -1; 63 while(1) 64 { 65 memset(czBuf,0,BUF_SIZE+1); 66 ret = read(fd,czBuf,BUF_SIZE); 67 if(ret < 0) 68 { 69 perror("read"); 70 return -1; 71 } 72 else if(ret == 0) 73 { 74 break; 75 } 76 else 77 { 78 if(flag == -1) 79 { 80 for(int index = 0;index < BUF_SIZE;index++) 81 { 82 if(czBuf[index] == '\n') 83 { 84 if(iCurLine == iStartLine) 85 { 86 flag = 0; 87 printf("%s",czBuf+index); 88 break; 89 } 90 iCurLine++; 91 } 92 } 93 } 94 else if(flag == 0) 95 { 96 printf("%s",czBuf); 97 } 98 } 99 } 100 } 101 else 102 { 103 while(1) 104 { 105 char czBuf[BUF_SIZE] = {0}; 106 ret = read(fd,czBuf,BUF_SIZE); 107 if(ret < 0) 108 { 109 perror("read"); 110 return -3; 111 } 112 else if(ret == 0) 113 { 114 break; 115 } 116 else 117 { 118 printf("%s",czBuf); 119 } 120 } 121 } 122 return 0; 123 } 124 125 int main(int argc,char *argv[]) 126 { 127 int fd = open("test.txt",O_RDONLY); 128 if(fd < 0) 129 { 130 perror("open"); 131 return -1; 132 } 133 134 int ret = myTail(fd,3); 135 if(ret < 0) 136 { 137 close(fd); 138 return -2; 139 } 140 141 close(fd); 142 return 0; 143 }