C - 使用getline()从文件中打印行

时间:2017-02-22 13:40:29

标签: c fgets getline

我正在尝试编写一个加载文本文件的简单C程序,将第一行打印到屏幕,等待用户按Enter然后打印下一行,依此类推。

仅作为参数,它接受作为流“数据库”加载的文本文件。根据{{​​3}}示例,我使用了getline() - 函数。编译好,成功加载文本文件,但程序永远不会进入while-loop然后退出。

#include <stdio.h>
#include <stdlib.h>

FILE *database = NULL; // input file

int main(int argc, char *argv[])
{
    /* assuming the user obeyed syntax and gave input-file as first argument*/  
    char *input = argv[1];

    /* Initializing input/database file */
    database = fopen(input, "r");
    if(database == NULL)
    {
        fprintf(stderr, "Something went wrong with reading the database/input file. Does it exist?\n");
        exit(EXIT_FAILURE);
    }

    printf("INFO: database file %s loaded.\n", input);

    /* Crucial part printing line after line */
    char *line = NULL;
    size_t len = 0;
    ssize_t read;

    while((read = getline(&line, &len, database)) != -1)
    {
        printf("INFO: Retrieved line of length %zu :\n", read);
        printf("%s \n", line);
        char confirm; // wait for user keystroke to proceed
        scanf("%c", &confirm);
        // no need to do anything with "confirm"
    }

    /* tidy up */
    free(line);
    fclose(database);
    exit(EXIT_SUCCESS);
}

我用fgets()尝试了 - 我也可以发布代码 - 但同样的事情:它永远不会进入while循环。

这可能是非常明显的事情;我是编程新手。

我在Kali Linux上使用gcc编译器。

3 个答案:

答案 0 :(得分:1)

使用stdin作为文件参数,使用fgetline更改scanf。

答案 1 :(得分:1)

您应该在调试器中逐步执行此操作,以确保您声称它从未进入while循环是正确的。

如果它真的永远不会进入while循环,那必然是因为getline()已经返回-1。文件确实为空,或者读取文件时出错。

man getline说:

  

成功时,getline()和getdelim()返回数字   人物         读取,包括分隔符,但不包括termi-          nating null byte(&#39; \ 0&#39;)。该值可用于处理嵌入式          读取行中的空字节。

     

两个函数在读取一行时都返回-1(包括结尾)      文件条件)。如果发生错误,则设置errno以指示      事业。

因此,您应该增强代码以检查流错误并处理errno - 即使代码正常工作也应该这样做,因为EOF不是函数的唯一原因 返回-1

  int len = getline(&line, &len, database);
  if(len == -1 && ferror(database)) {
        perror("Error reading database");
  }

您可以更明确的方式编写更详细的代码来处理errno

不幸的是,彻底处理这个问题会让你的代码变得更加冗长 - 欢迎来到C!

答案 2 :(得分:-1)

在Ubuntu Linux上的平台gcc ver.4.8.4上运行正常。你的gcc版本是什么?