【问题标题】:Storing Doubles from File to Array. Better Method?将双精度从文件存储到数组。更好的方法?
【发布时间】:2019-08-07 13:25:11
【问题描述】:

我正在处理一段程序,我必须从我创建的 .dat 文件中读取双打,该文件包含 12 个双打,如下所示:

10.0
20.0
30.0
40.0
50.0
60.0
70.0
80.0
90.0
100.0
110.0
120.0

这是我的代码:

double readSales(FILE *input, double sales[])
{
    int count = 0, n;
    double s;
    n = fscanf(input, "%lf", &s);
    sales[0] = s;

    while(n == 1)
    {
    n = fscanf(input, "%lf", &s);
    count++;
    sales[count] = s;
    }
}

这很好用,但我认为它写得不好,因为必须声明数组的第一个元素。问题是没有声明,我只是得到一个 0.0 作为数组的第一个元素。感谢您的任何反馈。

【问题讨论】:

  • 欢迎来到 StackOverflow!请务必使用tour 并访问help center。您能否发布显示您提到的问题的代码?然后你可以得到修复它的帮助。

标签: c


【解决方案1】:

在检查输入是否有效之前,您正在写入数组。我建议

int readSales(FILE *input, double sales[])      // change the type
{
    int count = 0;
    double s;
    while(fscanf(input, "%lf", &s) == 1) 
    {
        sales[count] = s;
        count++;
    }
    return count;                               // number of elements
}

【讨论】:

  • 也许像 if(ferror(input)) return perror("input"), 0; 这样的结尾会发出错误信号。
  • 另外,如果文件有 13 个双精度数,这个程序会崩溃——我会在分配之前检查计数。
  • @NeilEdelman 你怎么知道它会崩溃? OP 没有显示完整的代码。理想情况下,将最大数组长度作为参数传递是正确的,但这个答案解决了基本问题。
  • 我假设用户用double[12] 调用它,但你是对的,没有办法知道。可以传递一个指针double (*const)[12] 来打开编译时检查。
【解决方案2】:

这是我提供的一种实现方式。我已经添加了main()

#include <stdio.h>

size_t readSales( FILE *input, double sales[],
                  const size_t salesSize )
{
  if ( ! input || ! sales ) { return 0; }

  size_t numRead = 0;

  while ( numRead < salesSize &&
          fscanf( input, "%lf", sales++ ) ) numRead++;

  return numRead;
}

int main( int argc, char* argv[] )
{
  double d[12];
  FILE* fp = fopen( "sales.txt", "r" );

  if ( ! fp )
  {
    printf( "No sales.txt\n" );
    return 1;
  }

  size_t numRead = readSales( fp, d, sizeof d / sizeof( *d ) );

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

  fclose( fp );

  return 0;
}

最好将数组的大小作为readSales() 的参数包含在内,以避免缓冲区溢出,因此我修改了readSales() 签名。

为安全进行输入验证。

此答案解决了您在原始问题中所说的主要关注点:即避免初始化数组的第 0 个元素。你说得对,这项任务是不必要的。

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 2015-02-22
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多