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

the*_*n85 4 c getline

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

int lines = 0;
size_t * inputBuffer = (size_t *) malloc(sizeof(size_t));
char * storage = NULL;
Run Code Online (Sandbox Code Playgroud)

我这样叫getline:

getline(&storage, &s, input)
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*tch 7

这不是正确的用法getline.我强烈建议仔细阅读其手册页.

你可以有一些代码

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;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可能(并且可能应该更好)投入

  free(linebuf);
  linebuf=NULL;
Run Code Online (Sandbox Code Playgroud)

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

请注意,getline标准符合ISO/IEC TR 24731-2:2010扩展(参见n1248).


Bor*_*lid 5

缓冲区只包含您读取的最后一行getline.目的只是为了管理代码中的内存.

如果你反复调用getline,重复传递相同的缓冲区会发生什么,缓冲区将扩展到文件中最长行的长度并保持不变.每次调用都将用下一行替换其内容.

你没有提供它size_t*,你给它一个char*.