【发布时间】:2021-08-31 10:10:40
【问题描述】:
外部数组 srclns 应该从文本文件中保存每个读取的行。但是之后阅读它的内容似乎读取的行是空字符串。我在下面的代码中缺少什么?
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#define MAXSRC 20
char *srclns[MAXSRC]; /* source lines */
size_t read_lines(char *path)
{
FILE *stream;
ssize_t read;
char *lnptr;
size_t n;
size_t count;
stream = fopen(path, "r");
lnptr = NULL;
n = 0;
count = 0;
if (!stream) {
fprintf(stderr, "Can't open source '%s'\n", path);
exit(EXIT_FAILURE);
}
while ((read = getline(&lnptr, &n, stream)) != -1) {
srclns[count++] = lnptr;
}
free(lnptr);
fclose(stream);
return count;
}
int main()
{
size_t n = read_lines("foo.txt");
for (size_t i = 0; i<n; i++)
printf("%zu %s\n", i, srclns[i]);
exit(EXIT_SUCCESS);
}
这之后只打印带有看似空字符串的行号:
0
1
2
3
4
5
【问题讨论】:
-
根据手册,每次调用
getline,如果要分配新内存,需要将lnptr重置为NULL:man7.org/linux/man-pages/man3/getline.3.html。另外,在打印出这些行之前,您不应该free(lnptr); -
我无法阅读手册中有关分配新内存的任何内容。你能指出来吗?至于释放,我是把 lnptr 保存在数组里,不是吗?
-
指针不是它的内容,会被覆盖。
-
@Student: "如果在调用之前
*lineptr被设置为NULL,那么getline()将分配一个缓冲区来存储该行。" -
@Yun 我认为你是对的,我错过了关于在读取失败时必须释放的部分