【问题标题】:Reading values from a file and storing them into a multidimensional array从文件中读取值并将它们存储到多维数组中
【发布时间】:2012-01-20 17:00:30
【问题描述】:

我是 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. 将未知数量的项目放入多维数组的正确方法是什么。我应该这样做吗?

谢谢!

【问题讨论】:

  • 您能否包含实际为数据分配内存的代码部分? (你真的在分配内存吗?)

标签: c


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您的建议和帮助!是的,我不小心遗漏了分配内存的部分,但您仍然解决了问题。问题是我试图为 data[counter] 分配内存,但从未为 data[] 本身分配内存!
【解决方案2】:

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

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

关于以更优雅的方式读取文件;因为无论如何您都在阅读整个文件;

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

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

【讨论】:

  • 我猜这也会出现段错误,因为数据本身没有分配:)
  • 非常感谢。我希望我可以将您的两个答案都标记为正确,因为它们都有非常有用的数据。感谢您对如何阅读整个文件的解释。我相信这将是这个特定应用程序的最佳途径,但在你提到它之前,我不知道read()
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
相关资源
最近更新 更多