Чтение данных в массив с плавающей точкой в ​​C - PullRequest
2 голосов
/ 05 декабря 2009

Я делаю программу, в которой мне нужно загрузить некоторые данные с плавающей запятой формата из файла
103,45
123,45
456,67
......

Мне было интересно, как сохранить эти данные непосредственно в массив чисел с плавающей запятой, используя fread (). Я думаю, это не так сложно, используя указатели, но я не так хорош с ними. может кто-нибудь сказать мне, как

Ответы [ 5 ]

4 голосов
/ 05 декабря 2009

Для чтения данных из файла используйте fgets() и sscanf().

/* needs validation and error checking */
fgets(buf, sizeof buf, fp);
sscanf(buf, "%f", &tmp);

Для управления количеством поплавков у вас есть два варианта.

  1. использовать массив фиксированного размера
  2. используйте malloc(), realloc() и друзей для растущего массива

/* 1. use an array of fixed size */
float array[1000];

/* 2. use `malloc()`, `realloc()` and friends for a growable array */
float *array;
array = malloc(1000 * sizeof *array);
/* ... start loop to read floats ... */
    if (array_needs_to_grow) {
        float *tmp = realloc(array, new_size);
        if (tmp == NULL) /* oops, error: no memory */;
        array = tmp;
    }
/* end reading loop */
/* ... use array ... */
free(array);
3 голосов
/ 05 декабря 2009

Не уверен, что еще нужно, но это решает суть проблемы:

int j = 0;
double flts [20000];
while (!feof(f))
{
    if (fscanf (f, "%g", &flts [j]) == 1) 
        ++j; // if converted a value okay, increment counter
}
2 голосов
/ 05 декабря 2009

вы не можете, если ваш файл данных не находится в двоичном формате. Вы показываете обычный текстовый файл: чтобы получить это в массив, вам нужно сделать пару вещей: выяснить, сколько элементов нужно в массиве (количество строк?), Выделить массив, затем преобразовать и положить каждое значение в массиве. Преобразование можно выполнить, например, с помощью scanf.

2 голосов
/ 05 декабря 2009

Вы не можете использовать fread, так как это не анализирует форму файла, который у вас есть. fread просто читает байты в массив байтов, и у вас есть числа, записанные в читаемой человеком десятичной форме.

Я думаю, что для этого формата самый прямой способ, который вы можете использовать, это использовать fscanf в цикле, обязательно проверяя возвращаемое значение и, при ошибке, ferror и / или feof, чтобы проверить попали ли вы в конец файла или какая-то другая ошибка.

0 голосов
/ 05 декабря 2009

Поскольку это выглядит как файл с ASCII, я публикую следующую стратегию. Однако вы, похоже, предполагаете, что файл содержит двоичные данные. Это предположение основано на том факте, что вы пытаетесь прочитать его с помощью fread ().

Продолжайте читать строку за раз из файла и анализировать введенную строку из файла в число с плавающей запятой, делайте это до тех пор, пока файл не вернет EOF.

...