首先,一些背景:我试图从外部文件中获取整数列表并将它们放入数组中.我使用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()读取的所有项目?从这个缓冲区读取是否更简单,或者在将这些整数放入数组时以不同的方式遍历输入?谢谢!
这不是正确的用法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).
缓冲区只包含您读取的最后一行getline
.目的只是为了管理代码中的内存.
如果你反复调用getline
,重复传递相同的缓冲区会发生什么,缓冲区将扩展到文件中最长行的长度并保持不变.每次调用都将用下一行替换其内容.
你没有提供它size_t*
,你给它一个char*
.