从文件中读取值并将它们存储到多维数组中

时间:2012-01-20 17:00:31

标签: c

我是C的新手,所以如果你看到一些明显愚蠢的东西,请告诉我。)

我正在尝试做什么

我有一个新行分隔的字符串值的文件,我正在尝试读入我的程序,以便我可以使用它们与其他值进行比较。我认为存储它们的最佳方法是在多维数组中。我的代码看起来像这样:

char **data;
char *src_line;
int counter = 0; /* To keep track of how many items are in this array */
...
while(fgets(src_line,MAX_LINE_SIZE,fp_src_file) != NULL){
    int tmp = 0;
    while(src_line[tmp] != '\0'){
        if(src_line[tmp] == '\n'){
            src_line[tmp] = '\0';
        }
        tmp++;
    }
    strcpy(data[counter],src_line);
    counter++;
}

strcpy期间的这个段错误。我在网上发现的大多数处理多维数组的资源都使用常量值。我确信这可能不是最好的方法。

我的问题

  1. 有没有更好的方法来完成我想要做的事情?
  2. 将未知数量的项目放入多维数组的正确方法是什么。我应该这样做吗?
  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

正如我上面评论的那样,我不清楚你是不是为数据正确分配内存,或者你根本没有分配内存:)数据是一个问题。您希望它是一个字符数组数组,因此您需要(a)为char * s的顶级数组分配内存,然后(b)为字符数组本身分配内存。

因此,如果您有一个未知数量的项目,最简单的解决方案就是提出一个合理的最大值并为该最大值分配足够的,或者您只需查找\ ns,然后计算那些,然后您可以读取文件,然后适当地为数据分配内存等等。或者你可以假设你将拥有多少行,相应地分配数据,然后如果/当你用完空间时创建一个大小加倍的新数组,复制一切。这听起来比你想要的更多。

另一种可能更简单的方法 - fstat整个文件,只需创建一个足够大的缓冲区来容纳整个文件。读取整个文件。迭代,切换\ ns为\ 0s并计算行数。然后创建一个大小==您看到的行数的char **,并将它们分配给每行的开头。瞧 - 你的每行都有一个字符串,你不需要在内存分配方面做太多的事情。

答案 1 :(得分:1)

只是提示您现有的代码; strcpy实际上并没有为你分配存储空间,你需要给它一个缓冲区来复制数据。

data[counter] = malloc(strlen(src_line)+1);
strcpy(data[counter],src_line);

关于以更优雅的方式阅读文件;既然你正在阅读整个文件;

  • fstat文件以获取size和malloc文件大小+ 1.将fileBuffer [size]设置为0.
  • 通过一次“读取”调用将整个文件读入malloc'd块。
  • 将所有\ n替换为块中的\ 0,同时计算换行符数。
  • 分配正确大小的行指针数组(即如果文件不以换行符结尾,则为换行符数+ 1)
  • 循环遍历文件,在\ 0之后将数组中的连续指针设置为第一个内存地址(第一行是特殊情况并直接指向malloc的块)

这样你就可以在一个块中分配所有文件(并在一个块中释放),同时指向每一行。