【问题描述】 命令 tail用来打印文件中最后n行。 命令格式为:tail [-n] filename,其中: -n :n表示需要打印的行数,省略时n的值为10。 filename :给定文件名。 如,命令tail -20 example.txt 表示打印文件example.txt的最后20行,用C语言实现该程序。(提示:使用命令行参数) 【输入形式】 tail [-n] filename,其中:-n :n表示需要打印的行数,省略时n的值为10。 filename :给定文件名。 【输出形式】 打印文件filename的最后n行
时间: 2024-02-15 21:04:37 浏览: 93
以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_LENGTH 1024 // 最大行长度
#define DEFAULT_LINES 10 // 默认行数
int main(int argc, char *argv[]) {
FILE *fp;
char line[MAX_LINE_LENGTH];
int lines = DEFAULT_LINES;
int i, j;
// 解析命令行参数
if (argc < 2) {
printf("Usage: %s [-n] filename\n", argv[0]);
return 1;
}
if (argc == 3 && strncmp(argv[1], "-n", 2) == 0) {
lines = atoi(argv[2]);
} else if (argc == 2) {
// do nothing
} else {
printf("Usage: %s [-n] filename\n", argv[0]);
return 1;
}
fp = fopen(argv[argc-1], "r");
if (fp == NULL) {
printf("Error: cannot open file %s\n", argv[argc-1]);
return 1;
}
// 读取文件末尾n行
int count = 0;
long file_size, pos;
char *buffer;
fseek(fp, 0, SEEK_END);
file_size = ftell(fp);
buffer = (char*) malloc(file_size);
if (buffer == NULL) {
printf("Error: failed to allocate memory\n");
return 1;
}
for (pos = file_size - 1; pos > 0; pos--) {
fseek(fp, pos, SEEK_SET);
if (fgetc(fp) == '\n') {
count++;
if (count == lines) {
break;
}
}
}
// 打印文件末尾n行
while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) {
printf("%s", line);
}
fclose(fp);
free(buffer);
return 0;
}
```
运行时需要在命令行中输入类似于“tail -20 example.txt”的命令。
阅读全文