gpt4 book ai didi

c - 如何读取文件并同时填充数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:38 25 4
gpt4 key购买 nike

在我编写的 C 程序中,我必须从文本文件中读取值并将它们放入一个数组中以备后用。

我不喜欢我的代码(下面显示的片段),因为我做了两个 while 循环,第一个是计算值的数量,然后我创建了一个与该值一样大的数组,然后最后我再次读取文件,填充数组。

此外,在第一个循环中,我使用了一个变量 x,因为 fscanf() 需要它,但我在后面的代码中从未使用过它,我会如果可能的话,我想完全避免它。

int x, n=0, sum=0;
fp=fopen("data.txt", "r");

while(fscanf(fp,"%d\n",&x)!=EOF){
n++;
}

rewind(fp);
int v[n];

while(fscanf(fp,"%d\n",&v[i])!=EOF){
sum+=v[i];
i++;
}

那么,关于如何改进这段代码有什么建议吗?我想我可以通过在开始时声明一个“足够大”的数组并根据需要填充它来“修复”它。但我事先并不知道我必须处理多少个值,所以我决定放弃这种方法。

最佳答案

这是动态内存分配可以派上用场的场景。您可以按照下面描述的一般程序进行操作

  1. 定义一个指针。
  2. 打开文件fopen()并从文件 fscanf() 中读取第一个元素.还应注意错误检查。
  3. 如果读取成功,动态分配内存malloc()到指针并复制值。
  4. 阅读下一个元素。

    4.1。如果读取成功

    • 如果读取成功,重新分配内存realloc()增加一种新的元素大小。

    • 将最后读取的值复制到新分配的内存中。

    4.2。如果读取id失败,检查EOF并停止读取。

  5. 继续执行第 4 步。

此外,请记住,您使用动态内存分配分配的内存需要为 free() d也是。


请注意,referring to the comment @szczurcio 先生,这不是优化工作,因为您必须在每次成功读取时重新分配内存。为了最大限度地减少动态内存分配的影响,我们可以决定一个阈值,我们将使用该阈值分配内存,然后在用完时将前一个值的数量加倍。这样,分配将发生在一个 block 中,并且可以避免每个读取周期的分配开销。

关于c - 如何读取文件并同时填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31381036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com