- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
外部数组 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 的行为造成的它使用动态分配。
让我们仔细看看您的程序做了什么,特别是 while ((read = getline(&lnptr, &n, stream)) != -1)
循环:
getline 将与 &lnptr
一起使用,其类型为 char**
。
NULL
,它将在堆上(动态)分配足够的内存来存储正在读取的行。NULL
,那么它应该指向大小为n
的缓冲区
getline
重新分配内存,以便有足够大的可用缓冲区。重新分配后,n
会更新为新的缓冲区大小。在某些情况下,重新分配将意味着 lnptr
必须被修改并且将会被修改。 (如果当前缓冲区之后没有足够的连续内存空闲权,则可能会发生这种情况。在这种情况下,内存将被分配在堆上的其他地方。如果您对此感兴趣,我建议您研究一下,因为动态内存分配是一个相当复杂的过程。复杂的主题,否则只知道指针可能会改变,现在就足够了)。现在这是您的程序的问题(至少这是我可以从我所掌握的信息中推断出的。我可能是错的,但这似乎是最合理的解释):
lnptr
为NULL
。因此,getline 在堆上分配内存并存储该行,并更新 lnptr
以指向新分配的缓冲区。srclns[0]
srclns[count]
。srclns
中每个指针指向的内存。修复方法:您可以使用 malloc
和/或 calloc
显式处理动态分配,但这看起来有点复杂,并且如前所述,getline
可以处理它你。我的建议如下:
srclns
中的所有元素设置为 NULL
for(int i = 0; i < MAXSRC; ++i)
{
srclns[i] = NULL;
}
srclns
的新元素。每次调用 getline
都会看到一个 NULL
指针,从而分配内存并更新 srclns
的单元格以指向它。通过此实现,您可以确保永远不会超出 srclns 范围: for(int i = 0; i < MAXSRC; ++i)
{
n = 0
if(getline(&srclns[i], &n, stream) == -1)
{
break; // We get out if we reached OEF
}
}
printf
访问 main 中分配的所有内存后,释放它 for(int i = 0; i < MAXSRC; ++i)
{
if(srclns[i] != NULL)
{
free(srclns[i]);
}
}
关于c - 将 getline() 输出保存到外部数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68996815/
main = do input [f a] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) x sequenceA xs 很
while(getline()) 和 while(!getline().eof()) 有什么区别? 正在解析输入字符串。我尝试了两种条件检查,结果有所不同。 std::string testStr =
我知道我知道。以前有人问过这个问题,但我查看了所有答案,但似乎没有一个能解决我的问题。当我使用 getline 函数获取文件中一行的内容时,它不起作用。 getline(file, line); '文
使用 getline() 函数时出现以下错误: 没有重载函数“getline”的实例匹配参数列表 在一个名为“Time”的类中,我在读取以下输入时使用它: istream & operator >>
我正在阅读 C++ 入门书并尝试所有代码示例。我对这个很感兴趣: #include #include using std::string; using std::cin; using std::c
#include #include #include using namespace std; int main() { char d,a[9],e[9]; cin.getline(a,9); c
假设我想从控制台读取一个整数,并且我不希望程序在输入非整数字符时中断。这就是我的做法: #include #include #include using namespace std; int m
这可能不是一个错误,但我不知道出了什么问题。我的第一个条目在第二次迭代中对 str1 重复,并且从那时起也是如此。只有第一次迭代顺利。 #include #include using namesp
string text; getline(text.c_str(),256); 1) 我收到错误消息“错误:没有匹配函数来调用‘getline(const char*, int)”上面有什么问题,因为
哪个更好,更受欢迎?我真的发现阅读 API 令人困惑。 最佳答案 成员(member)版读入char*,免费版读入std::string。所以更喜欢免费版!像这样使用它: std::istream &
我正在尝试解决这个问题,但出于某种原因,我一直收到这个问题: no instance of "getline" matches the argument list. 我查过这个问题,很多次是因为人们使
长话短说 使用 libc++ 版本的 getline 函数的程序在从管道读取输入时会阻塞,直到管道的缓冲区已满。 NOT libstdc++ 版本的 getline 函数也是如此:这里函数立即读取并返
我的程序的一部分: #include #include #include #include #include using namespace std; /* Works for istrin
我是一名正在准备期末考试的 C++ 初学者。我用两种方式写了一个程序。第一个代码使用 cin.getline() 并且不能正常工作。第二个代码使用 cin.get() 和 cin >> 并正确执行所有
我正在尝试使用 getline 解析文档以获取整行并将其放入名为“line”的字符串变量中。问题是我收到一条错误消息:“没有重载函数 getline 的实例与参数列表匹配。”谁能帮我解决这个问题? #
我有一个带有 getline 函数的源代码文件,当我编译它时收到错误(下面的代码和错误)。我的问题是我从一个已经编译和工作的程序(也包括在下面)中复制并粘贴了整个函数。我在程序的其他 2 个源代码文件
我正在尝试从文件中读取,但 C++ 不想运行 getline()。 我收到这个错误: C:\main.cpp:18: error: no matching function for call to '
例子: std::ifstream in("some_file.txt"); std::string line; // must be outside ? while(getline(in,line)
注意:已解决,问题不是 getline() 而是 find 函数数组填充不当! 在发布我自己的问题之前,我已经查找了几个问题,但找不到我的问题的答案。这是我发布的第一个问题,但在发布我自己的问题之前,
我的代码块中有一个 getline 函数。但是在编译 make 文件时出现以下错误: cc -DMAIN -c -o terp.o terp.c terp.c:130:15: error: con
我是一名优秀的程序员,十分优秀!