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; iprocess_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() - 如何处理缓冲区/如何将未知数量的值读入数组的主要内容,如果未能解决你的问题,请参考以下文章