无限制地从文件读取和存储行到数组

时间:2017-04-21 14:35:51

标签: c

我需要从文件中创建读取行,但我不知道一行会有多长。到目前为止,我唯一能想到的就是使用fgetc和realloc

FILE* cFile = fopen(filename, "r");
....
//some while cycle for going from line to line
....
//now for reading the line itself
char* line = malloc(sizeof(char)); //one empty spot for the '\n'
unsigned int = 0;
char c = getc(cFile);
while (c != '\n') {
    line[i] = c;
    line = realloc(line, (i+2)*(sizeof(char));
    i++;
    c = getc(cfile);
}
line[i] = c;

我没有查看EOL的所有检查,或者我是否真的得到了分配的内存,这只是一个例子。

我的问题是,有没有更有效的方法获得未知长度的线?

2 个答案:

答案 0 :(得分:1)

一次使用多个字符增加缓冲区大小可能会更有效,例如从大小80开始,当缓冲区已满时将大小加倍,并在必要时将其缩小。< / p>

但这会使您的代码更复杂,因此更容易出错,所以请记住如何手动优化代码的两个规则:

  1. 不要这样做。
  2. 仅限专家:不要这样做。
  3. 也就是说,不要这样做,因为这可能不值得。你可能会花费一个多小时的时间来改善&#34;您的代码,除非您知道实际需要加速,否则您可能不会注意到差异。除此之外,更复杂的代码错误的风险,并花费数百小时找到难以捉摸的错误,最终导致这个小读取功能导致内存损坏。

    而且,如果您真的知道自己在做什么,并且需要额外的速度,那就不要开始优化这段代码,直到您知道(即测量)它为止实际上是在这里花费了执行时间。

答案 1 :(得分:1)

如果您正在使用POSIX系统,请使用getline(3),它完全符合您的要求。否则,您可以在许多地方找到免费的getline实现,例如herehere

相关问题