C getline() - 如何处理缓冲区/如何将未知数量的值读入数组

Posted

技术标签:

【中文标题】C getline() - 如何处理缓冲区/如何将未知数量的值读入数组【英文标题】:C getline() - how to deal with buffers / how to read unknown number of values into array 【发布时间】:2012-02-28 14:21:55 【问题描述】:

首先,一些背景知识:我试图从外部文件中获取整数列表并将它们放入数组中。我正在使用 getline 逐行解析输入文件:

int lines = 0;
size_t * inputBuffer = (size_t *) malloc(sizeof(size_t));
char * storage = NULL;

我这样调用 getline:

getline(&storage, &s, input)

我从 getline 的手册页中听说,如果您提供 size_t * 缓冲区,当它超过字节分配时,您可以让 getline 为您调整它的大小。我的问题是,你可以用这个缓冲区做什么?它会包含您使用 getline() 读取的所有项目吗?在将这些整数放入数组时,从这个缓冲区中读取或者以不同的方式遍历输入是否更简单?谢谢!

【问题讨论】:

【参考方案1】:

这不是getline 的正确用法。我强烈建议仔细阅读它的man page。

你可以有一些类似的代码

FILE *inputfile=fopen("yourinput.txt", "r");
size_t linesiz=0;
char* linebuf=0;
ssize_t linelen=0;
while ((linelen=getline(&linebuf, &linesiz, inputfile)>0) 
  process_line(linebuf, linesiz);
  // etc
  free(linebuf);
  linebuf=NULL;

顺便说一句,你可能(而且可能应该更好)放

  free(linebuf);
  linebuf=NULL;

... 在while 循环之后(以保持从一行到下一行分配的行缓冲区),并且在大多数情况下最好这样做(以避免过于频繁的malloc-s 来自@987654329 @)。

注意getline is in ISO/IEC TR 24731-2:2010 扩展(参见n1248)。

【讨论】:

这基本上是我在代码中所做的,但我的主要问题是因为我得到一个大小未知的数组,我需要先遍历数组并计算有多少行.有可能以某种方式做到这一点吗? while ((linelen=getline(&linebuf, &linesiz, inputfile)>0) numOfLines ++; for(i = 0; i process_line 实际上可以是任何你想要的。你可以有一个char**linearr 指针和malloc 它等等......然后使用linearr[i++] = strdup(linebuf); 我关心的问题是,当你 malloc 时,你必须有一个定义的大小,对吗?如果我同时计算数组中的元素并将它们一次添加到数组中,如果我不使用链表之类的东西,我不确定如何获取大小。 但是您可以在运行时动态增长数组(通过malloc一个更大的数组,然后复制旧变体的内容,然后free-ing 那个旧变体并使用新的更大的@ 987654337@-ated 一)。您绝对不需要计算行数......只需在需要时扩展数组! 每次通过for循环复制整个数组不是要占用很多处理时间吗?不过,我绝对可以看到它的工作原理。【参考方案2】:

缓冲区将只包含您使用getline 读取的最后 行。目的只是从代码中节省一点管理内存的工作量。

如果您反复调用getline,将相同的缓冲区反复传递给它,会发生什么情况,缓冲区将扩展至文件中最长行的长度并停留在那里。每次调用都会将其内容替换为下一行的内容。

您提供的不是size_t*,而是char*

【讨论】:

哦,好的,我现在明白了。那么是否可以使用 getline() 遍历输入一次并计算行数,然后使用 getline 再次遍历并将值存储到 malloc'ed 数组中? @theeggman85 如果您fseek 回到文件的开头(或关闭它然后再次打开它),是的。您还可以使用链表或其他动态增长的结构,只需要一次。

以上是关于C getline() - 如何处理缓冲区/如何将未知数量的值读入数组的主要内容,如果未能解决你的问题,请参考以下文章

string 类型的输入操作符 cin 和 getline 函数分别如何处理空白字符?

如何处理nodejs中的数组缓冲区分配失败?

如何处理插入 '\0' 的字符数组?

如何处理Android中的防缓冲区溢出技术

Apache Apex 如何处理背压?

Flink 如何处理背压