从C中的文件读取长行时处理内存
首先,我知道这个问题与这个主题非常接近,但问题是措辞太差,以至于我甚至不确定它是否重复加上没有显示代码所以我认为它应该被正确地问。
我试图逐行读取文件,我需要在variable
中特别存储一行。 我已经设法使用fgets
很容易地完成了这个操作,但是要读取的行的大小和文件中的行数 仍然未知 。
我需要一种方法来正确地为variable
分配内存,无论行的大小如何, 使用C而不是C ++ 。
到目前为止我的代码看起来像这样:
allowedMemory = malloc(sizeof(char[1501])); // Checks if enough memory if (NULL == allowedMemory) { fprintf(stderr, "Not enough memory. \n"); exit(1); } else char* res; res = allowedMemory; while(fgets(res, 1500, file)) // Iterate until end of file { if (res == theLineIWant) // Using strcmp instead of == return res; }
这段代码的问题在于它根本不具备适应性。 我正在寻找一种方法来为res
分配足够的内存,这样我就不会错过任何数据。
我在考虑这样的事情:
while ( lineContainingKChar != LineContainingK+1Char) // meaning that the line has not been fully read // And using strcmp instead of == realloc(lineContainingKChar, K + 100) // Adding memory
但是我需要迭代两个FILE
对象以填充这些效率不高的变量。 任何有关如何实施此解决方案的提示或建议如何以更简单的方式执行此解决方案将不胜感激。
编辑:似乎使用getline()
是最好的方法,因为这个函数分配自己需要的内存,并在需要时释放它。 然而,我不认为它是100%便携式的,因为我仍然不能使用它虽然我已经包含 。 需要validation,因为我的问题通常位于键盘和计算机之间。 在此之前,我仍然愿意接受不使用POSIX兼容C的解决方案。
getline()
似乎完全符合你的要求:
描述
getdelim()
函数应从流中读取,直到遇到与分隔符匹配的字符。…
getline()
函数应等于getdelim()
函数,其delimiter
符等于字符。
…
例子
#include
#include int main(void) { FILE *fp; char *line = NULL; size_t len = 0; ssize_t read; fp = fopen("/etc/motd", "r"); if (fp == NULL) exit(1); while ((read = getline(&line, &len, fp)) != -1) { printf("Retrieved line of length %zu :\n", read); printf("%s", line); } if (ferror(fp)) { /* handle error */ } free(line); fclose(fp); return 0; }
并根据Linux手册页 :
描述
getline()
从流中读取整行,将包含文本的缓冲区的地址存储到*lineptr
。 缓冲区以null结尾,并包含换行符(如果找到)。如果在调用之前
*lineptr
设置为NULL
并且*n
设置为0,则getline()
将分配用于存储该行的缓冲区。 即使getline()
失败,用户程序也应释放此缓冲区。或者,在调用
getline()
之前,*lineptr
可以包含一个指向malloc(3)
分配缓冲区*n
字节大小的指针。 如果缓冲区不足以容纳该行,则getline()
使用realloc(3)
调整其大小,根据需要更新*lineptr
和*n
。在任何一种情况下,在成功调用时,
*lineptr
和*n
将被更新以分别反映缓冲区地址和分配的大小。