目录
题目
实现“head -n 文件名”命令的功能
思路
思路:循环读,读到就累加行数,并且打印到终端,判断是否达到最后一行,达到就退出。
实现“head -n 文件名”命令的功能
例:head -3 test.c -> ./a.out -3 test.c
atoi: "123" -> 123(整型)
argv[1]: "-3" 的首地址
argv[1]+1: "3" 的首地址
atoi(argv[1]+1) ==> 3
首先检查命令行参数的数量。如果不是 3 个,即没有按照指定格式(
./a.out -n <filename>
)输入,通过printf
输出错误提示信息并返回-1
结束程序。使用
fopen
函数以只读模式打开指定的文件名(argv[2]
)。如果打开失败(返回NULL
),通过perror
输出错误信息并返回-1
结束程序。通过
atoi(argv[1] + 1)
将命令行参数中紧跟-
后的数字部分转换为整数,存储在num
中,用于指定要打印的行数。定义字符数组
buf
用于存储每次读取的内容,以及整数len
用于记录已读取的行数。使用
while
循环通过fgets
从文件中读取内容到buf
中。在每次读取后,如果读取到的内容以换行符结尾(通过检查buf[strlen(buf) - 1] == '\n'
),则将行数len
加 1 。如果已读取的行数
len
超过指定的行数num
,就通过break
退出循环。在循环中,使用
fputs
将每次读取到的内容打印到标准输出(终端)。循环结束后,使用
fclose
关闭文件,释放相关资源。总的来说,这段代码的目的是根据命令行指定的行数,从文件中读取并打印相应数量的行到终端
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
if (argc != 3)
{
printf("err: %s -n <filename>\n", argv[0]); //./a.out -n <filename>
return -1;
}
FILE *fp = fopen(argv[2], "r");
if (fp == NULL)
{
perror("fopen err");
return -1;
}
//获取行数
int num = atoi(argv[1] + 1); // +1是为了向后偏移一个地址单位把-去掉获取到要打印的行数
char buf[32] = "";
int len = 0;
//循环读,然后数换行,打印到终端,如果是最后一行就退出
while (fgets(buf, 32, fp) != NULL)
{
if (buf[strlen(buf) - 1] == '\n') //数换行
len++;
if (len > num) //达到行数就退出
break;
fputs(buf, stdout); //打印内容到终端
}
fclose(fp);
return 0;
}