从文件到数组存储双打。更好的方法?

时间:2019-03-16 18:10:49

标签: c

我正在程序的一部分上,我必须从创建的.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作为数组的第一个元素。谢谢您的反馈。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

这是我提出的实现此目标的一种方法。我包括了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个元素。您是正确的,该任务是不必要的。