在c中逐行读取具有可变行长度的文件

csk*_*wrd 4 c file-io

在C中,有没有一种方法可以逐行读取文本文件而不知道要为它分配多少空间?

这是我的意思的一个例子:

fgets(line, <dynamic line size>, fileHandle);
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

R S*_*hko 5

没什么自动的.您需要继续增加缓冲区并调用fgets,直到获得换行符或EOF.

// NOTE: not production ready as does not handle memory allocation failures
size_t alloced = 128;
char *p = malloc(alloced);
char *walk = p;
size_t to_read = alloced;

for (;;) {
    if (fgets(walk, to_read, fp) == NULL)
        break;

    if (walk[strlen(walk) - 1] == '\n')
        break;

    to_read = alloced;
    alloced *= 2;

    p = realloc(p, allocated);
    walk = p + to_read;
}
Run Code Online (Sandbox Code Playgroud)

  • 这段代码毫无意义.`len`在第5行使用,尽管直到第9行才被声明.`do {...}`块在结尾处缺少`while(...)`. (3认同)
  • @MatthewFlaschen - 同意了,但fgets()本身对于嵌入式NUL的行不能很好地工作(无法区分从fp读取的NUL与在末尾写入的NUL).因此,如果您的代码使用fgets是可以的,那么使用这种技术应该没问题. (2认同)