如何在C语言中从文件中读取一行

7

我想逐行读取文件中的内容,但是尝试过程中出现了问题。

以下是我的尝试:

FILE *file;
char *line = NULL;
int len = 0;
char read;
file=fopen(argv[1], "r");

if (file == NULL)
    return 1;

while ((read = getline(&line, len, file)) != -1) {
    printf("Retrieved line of length %s :\n", &read);
    printf("%s", line);
}

if (line)
    free(line);

return 0;

有什么建议,为什么它不起作用?

1
2个错误... 1:- 行只是一个指针,该指针需要指向一些malloced内存.... 2:- len = 0,为什么要读取0字节???请在Google上搜索“C语言中的简单文件操作程序”... - Deepthought
2
@Deepthought 不,getline() 不是这样工作的。它为行本身分配内存。 - user529758
2
请参考man getline中的示例。 - Sunil Bojanapally
1
可能是C逐行读取文件的重复问题。 - Ciro Santilli OurBigBook.com
您的编译器应该告诉您 getline 函数的第二个参数是错误的。它需要一个指针而不是一个整数。 - Jens Gustedt
3个回答

5
为了使其正常工作,需要进行一些更改。
int len 更改为 size_t len 以获得正确的类型。 getline() 的语法不正确。应该是:
while ((read = getline(&line, &len, file)) != -1) {

而且printf行也应该被修改,以打印返回的数字而不是char和字符串解释:

printf("Retrieved line of length %d:\n", read);

1
注意:read 应该是 ssize_t 类型而不是 char。有两个问题:char 可能是 unsigned char,并且永远不等于 -1,而且 char 的范围与 ssize_t 不同。printf() 格式说明符也有点问题。建议使用:printf("Retrieved line of length %lld:\n", (long long) read); - chux - Reinstate Monica

4

或者你也可以使用这段代码。它将逐行读取整个文件并打印这些行。

char buf[1000];

ptr_file =fopen("input3.txt","r");
if (!ptr_file)
    return 1;

while (fgets(buf,1000, ptr_file)!=NULL)
    printf("%s",buf);

3

getline() 的第二个参数是(非常)错误的。

它应该是size_t *,而你传递了int。你应该会因为这个问题收到编译器警告。

修改为:

size_t len;

在这个调用中:
getline(&line, &len, file)

此外,返回值的类型是ssize_t而不是char

在编写使用getline()函数的代码之前,请确保阅读手册页面getline()并确保理解它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接