将文件从指定行读取到另一行

时间:2016-02-04 04:16:50

标签: c

我目前在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);




}

我尝试将lsize更改为firstNumsecondNum,这些是从命令行输入的数字,但仍然无法正常工作并输出一个线。

这样做的更好方法是什么?

2 个答案:

答案 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之类的替代方案,而不是低级readwrite

  • 要逐行阅读,您应该使用库函数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