我正在尝试编写一个加载文本文件的简单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编译器。
答案 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版本是什么?