【问题标题】:How to read unknown number of floats from a file? [duplicate]如何从文件中读取未知数量的浮点数? [复制]
【发布时间】:2012-02-01 20:49:09
【问题描述】:

可能重复:
C dynamically growing array

我有一个程序,我需要从文件中读取浮点数。每行是一个浮点数。问题是这个文件可能很大

 float tab[1000];     
 
 f = fopen ("data.txt", "r");
 i=0;   
 while (feof(f) == 0) {        
   fscanf (f, "%f\n", &tab[i]);                
   i++;    
 }

如果数组太小,如何动态更改数组大小?

【问题讨论】:

标签: c arrays file numbers floating-point


【解决方案1】:

从合适的尺寸开始,malloc,然后根据需要使用realloc

double *tab;
int num = 1000;

tab = malloc(num * sizeof *tab);

while (..) {
    if (i >= num)
        num *= 2;

    tab = realloc(tab, num * sizeof *tab);
    /* ... */
}
  • 您应该尝试覆盖大多数输入而不需要太多内存的初始大小
  • 您可以尝试不同的 realloc 策略,大小加倍只是其中之一
  • 您可能应该检查mallocrealloc 的结果

【讨论】:

    【解决方案2】:

    如果您同时在内存中需要它们,@cnicutar 建议的 mallocrealloc 可能是最好的解决方案。

    但是对于许多问题,您实际上一次只需要处理一个值。继续阅读,直到到达文件末尾。这取决于问题的性质。

    您应该更正代码中的几个问题:

    • "%d" 需要 int* 参数;使用"%f" 读取float 数据。
    • 不要使用feof(f) 来检测文件的结尾。检查fscanf()(或您正在使用的任何输入例程)返回的值。 feof() 用于区分正常的文件结束条件和错误条件,只有在输入函数已经告诉您数据已用完后才能使用。

    【讨论】:

    • 不要使用 feof(f) 来检测文件的结尾 +1,中肯的建议。
    【解决方案3】:

    您需要使用malloc 手动分配内存。如果你缓冲得到小调用realloc

    【讨论】:

      【解决方案4】:

      如果数组是在堆栈上分配的,则无法动态更改数组的大小。你需要这样的东西:

      tab = calloc(1000, sizeof(float));
      
      ...
      
      // need to resize
      tmp = realloc(tab, (1000 + NUM_NEW_ELEMENTS) * sizeof(float));
      if (tmp != NULL)
        tab = tmp;
      

      【讨论】:

      • calloc() 将分配的空间设置为全位为零,这通常是浪费的。该标准不保证浮点 0.0 表示为所有位为零,如果您的代码编写正确,您将不会引用数组的任何元素,直到您自己为它们分配值。 float *tab; tab = malloc(1000 * sizeof *tab); 更干净。 (或者您可以将tab 初始化为NULL 并为每个 分配使用realloc()。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多