Хранение двойников из файла в массив. Лучший метод? - PullRequest
0 голосов
/ 16 марта 2019

Я работаю над сегментом программы, где мне нужно читать двойные числа из созданного мной файла .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 ]

1 голос
/ 16 марта 2019

Вы пишете в массив, прежде чем проверять, является ли ввод действительным.Я предлагаю

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
}
0 голосов
/ 16 марта 2019

Вот мое предложение об одном способе реализации этого. Я включил 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-го элемента массива. Вы правы в том, что это не нужно для задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...