【发布时间】:2015-09-11 21:25:22
【问题描述】:
环顾网上,我还没有找到与fgets() 字符指针数组(char *restrict s)在有效内存分配方面相关的明确答案。
简介:char *fgets(char *restrict s, int n, FILE *restrict stream);
看着fgets() - specification
根据我对本规范的理解,您应该根据<limits.h> - specification 中定义的LINE_MAX 宏进行分配,因为您不知道每行有多少个字符。
如果我运行 - printf("LINE_MAX BYTES: %d\n", LINE_MAX);,结果是 2048。
话虽如此,声明char *line[LINE_MAX] - 或- char *line[2048] 对我来说似乎效率低下,但是,这可能是最好的方法吗?
//程序
#include <stdio.h>
#include <limits.h>
int main(void){
char line[LINE_MAX];
FILE *fp = fopen("file.txt", "r");
while(fgets(line, LINE_MAX + 1, fp)){
printf("%s", line);
}
fclose(fp);
return(0);
}
//文件(文件.txt)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
【问题讨论】:
-
malloc一些内存,一个字符一个字符地读取,如果没有足够的缓冲区空间,则使用realloc,添加一个百分比或一个固定数量的大小。 -
或
malloc(),通过fgets()读取,如果您在到达行尾之前填充缓冲区,则realloc()并读取更多内容。 -
实际上,在大多数现代环境中,2048 字节并不是那么多。当然还不够,我会流汗。真正的问题是,我认为依赖不超过
LINE_MAX个字符的行是不安全的。 -
另外,如果您使用静态分配,请不要忘记允许
LINE_MAX + 1字符,因为您也需要为字符串终止符留出空间。 -
@JordanDavis,您首先要猜测“合理”行可以有多长,然后分配那么多。调用
fgets()后,如果成功,可以通过strlen()判断行长。或者,您可以将缓冲区末尾的字节初始化为\x7f、\7f,并在fgets()之后检查它是否以\0结尾,前面有\n以外的其他内容。如果是这样,那么fgets()耗尽了缓冲区,你需要扩大它。
标签: c linux memory buffer fgets