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]$