迭代文件目录并将每行读入数组

时间:2011-03-12 18:16:38

标签: c linux

我想知道将数据目录逐行读入数组的最有效方法是什么。我的任务是在目录中搜索以特定扩展名结尾的文件,并读取该文件的每一行,每行只包含整数到一个维度数组。然后转到下一个文件并将该文件的每一行添加到现有数组中。我在看reading a text file into an array in c,并且认为我可以修改约翰内斯的例子以适应我的情景。提前谢谢。

编辑:

当我说效率高时我就是在内存分配方面道歉。它也必须在c中。我添加了家庭作业标签,并将研究glob上的手册页。会报告回来。

1 个答案:

答案 0 :(得分:1)

如果我是正确的,那么任务是收集具有一些扩展名的一组文件中每行的数字。

迭代文件可以通过多种方式完成,匹配文件扩展名也可以。将未知数量的元素添加到数组也是如此。

根据我对问题的理解,这是一个建议的解决方案:

#include <stdio.h>
#include <stdlib.h>
#include <glob.h>

int main(int argc, char *argv[])
{
  char pattern[] = "/tmp/*.txt";
  glob_t globbuf;
  FILE *file;
  int i, num, n = 0, max = 10;
  int *numbers = malloc(sizeof(int) * max);

  glob(pattern, 0, NULL, &globbuf);

  for (i = 0; i < globbuf.gl_pathc; i++)
  {
    if ((file = fopen(globbuf.gl_pathv[i], "r")) != NULL)
    {
      while (fscanf(file, "%d\n", &num) == 1)
      {
        numbers[n] = num;
        n++;

        if (n >= max)
        {
          max = max * 2;
          numbers = realloc(numbers, sizeof(int) * max);
        }
      }
      fclose(file);
    }
  }

  globfree(&globbuf);

  printf("Collected numbers:\n");

  for (i = 0; i < n; i++)
  {
    printf("%d\n", numbers[i]);
  }

  free(numbers);

  return 0;
}

使用glob功能,在单个操作中找到并匹配文件以获得正确的扩展名。每次空间不足时,使用realloc在动态分配的数组中收集数字,其大小加倍。