我目前在C中有一个shell脚本,它接受一个文件,两个数字,第m行和第n行的命令,并且应该在这些行之间输出什么:
例如:
./output file1 2 6
将文件从第2行输出到第6行
我目前以输出整个文件的方式实现它,我一直在尝试将其更改为在这些行之间具体输出
这是我的代码
#include <fcntl.h>
int main(int argc, char *argv[])
{
int file;
int size;
int l[1000];
int firstNum = atoi(argv[2]);
int secondNum = atoi(argv[3]);
file = open(argv[1], O_RDONLY);
if( file == -1)
{
printf("\n cannot open file \n");
}
while ((size=read(file,l,80)) > 0)
write(1,l,size);
}
我尝试将l
和size
更改为firstNum
和secondNum
,这些是从命令行输入的数字,但仍然无法正常工作并输出一个线。
这样做的更好方法是什么?
答案 0 :(得分:2)
您的代码存在一些问题,因此请按顺序执行:
最好使用高级fopen
而不是低级open
来打开文件。所以最好这样写:
FILE *file = fopen(argv[1], "r");
if (file == NULL)
exit(EXIT_FAILURE);
您的read
错误,因为它正好显示80个字符而不是您想要的一行。
while ((size=read(file,l,80)) > 0) // <-- WRONG because this reads 80 chars instead of one line
出于与open
类似的原因,最好使用printf
之类的替代方案,而不是低级read
和write
。
要逐行阅读,您应该使用库函数getline
。
要控制要打印的行号,一种简单的方法是让变量跟踪行号并与命令行参数进行比较。
所以把它们放在一起,你需要这样的东西:
FILE *file = fopen(argv[1], "r");
if (file == NULL)
exit(EXIT_FAILURE);
int line_num = 0;
char * line = NULL;
size_t len = 0;
ssize_t read = 0;
while ((read = getline(&line, &len, file)) != -1)
{
line_num++;
if( firstNum <= line_num && line_num <= secondNum )
{
printf( "line %d: %s", line_num, line );
if( line_num == secondNum )
break;
}
}
答案 1 :(得分:0)
尝试查看此帖:C read file line by line
从那里开始计算读取行并将其丢弃应该是一件简单的事情,直到您读到firstNum
行,然后打印到secondNum
。