C程序,功能如题,代码如下:
/* 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据 基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFLEN 256 // 显示一个文件的最后len行数据 void run(char *filename, int len) { int i; char **buf = NULL; char temp[BUFLEN] = {0}; FILE *fp; buf = malloc(len * sizeof(char*)); for(i = 0; i < len; i++) { buf[i] = (char*)malloc(BUFLEN * sizeof(char)); memset(buf[i], 0, BUFLEN * sizeof(char)); // 清零 } if((fp = fopen(filename, "r")) == NULL) { printf("open file [%s] failed\n", filename); } else { i = 0; int lineCount = 0; // 文件的实际行数 while(fgets(temp, BUFLEN, fp) != NULL) { strcpy(buf[i], temp); i = (i + 1) % len; lineCount++; // 数据行数加1 } printf("lineCount = %d\n", lineCount); if(lineCount <= len) // 文件实际行数小于等于需要提取的行数 { for(i = 0; i < lineCount; i++) printf("L%d: %s", i+1, buf[i]); } else { int start = i; do { printf("L%d: %s", i, buf[i]); i = (i + 1 + len) % len; } while (i != start); } } fclose(fp); for(i = 0; i < len; i++) free(buf[i]); free(buf); } int main(int argc, char *argv[]) { if(argc < 3) { printf("Usage: %s <filename> <n>\n", argv[0]); } else { int n = atoi(argv[2]); run(argv[1], n); printf("\n"); } return 0; }
运行结果:
[zcm@t #93]$./a test2.txt 2 lineCount = 4 L0: 3 chinese Chinese environment L1: 4 english English environment [zcm@t #94]$./a test2.txt 5 lineCount = 4 L1: 1 come one, obay L2: 2 <Quidway> language-mode ? L3: 3 chinese Chinese environment L4: 4 english English environment [zcm@t #95]$./a test2.txt 4 lineCount = 4 L1: 1 come one, obay L2: 2 <Quidway> language-mode ? L3: 3 chinese Chinese environment L4: 4 english English environment [zcm@t #96]$./a test2.txt 3 lineCount = 4 L1: 2 <Quidway> language-mode ? L2: 3 chinese Chinese environment L0: 4 english English environment [zcm@t #97]$