Как читать float из файла в C - PullRequest
0 голосов
/ 08 мая 2011

Предположим, что файл организован следующим образом:

1.2 # 3.4 # 4.0

2.3 # 2.3 # 1.2

Чтение файла на С и сохранение данных в массиве. Между тем, вы должны судить, сколько строк.

Моя проблема: 1) Я не знаю, как объявить массив, так как я не знаю, сколько чисел существует в файле, поэтому я должен просмотреть файл ранее и посчитать число?

2) Я не знаю, как судить о номере строки, так как последний '\ n' в файле может существовать или не существовать.

Ответы [ 5 ]

1 голос
/ 08 мая 2011

Ответ на 1) Как объявить массив, если вы не знаете заранее количество элементов, неразрешимо с примитивными векторами, вам придется создать свой собственный вектор, способный к росту.

typedef struct {
    double * v;
    unsigned int size;
} Vector;

Эта структура является основой нового типа данных.Вам понадобится API, например:

Vector createVector();

void addToVector(Vector *v, double x);
double getFromVector(Vector *v, unsigned int pos);
void modifyInVector(Vector *v, unsigned int pos, double x);
unsigned int sizeOfVector(Vector * v);

void destroyVector(Vector *v);

Ключевыми элементами API являются createVector, destroyVector и addToVector.Так как это, вероятно, домашнее задание, я не буду решать это для вас.

В createVector вы должны в основном установить все поля в 0. В destroyVector вы должны free () v;В addToVector вам придется изменить размер () зарезервированного пространства, чтобы уместился еще один новый элемент:

size_t newSize = ( v->size +1 ) * sizeof( double );

Теперь вам нужно вызвать realloc () с новым размером.

И этов основном все.Если вам нужна более высокая производительность, вы можете ввести емкость вектора, чтобы вам не приходилось увеличивать его при каждом добавлении нового значения.Например, люди, которые создавали STL в C ++, увеличивают векторный класс до его удвоения при каждом превышении емкости.Но, в любом случае, это другая история.

1 голос
/ 08 мая 2011

Использование fscanf:

Функция fscanf () должна считывать из указанного входного потока. [...] Каждая функция читает байты, интерпретирует их в соответствии с форматом и сохраняет результаты в своих аргументах. Каждый ожидает в качестве аргументов формат управляющей строки, описанный ниже, и набор аргументов указателя, указывающих, где должен быть сохранен преобразованный ввод.

1 голос
/ 08 мая 2011

atof (ascii to float):

http://en.wikipedia.org/wiki/Atof

0 голосов
/ 08 мая 2011

Плавающая точка имеет потерю точности для десятичных дробей.Например, простое число, такое как «0,1», нуждается в бесконечном количестве битов, чтобы точно представить его.

Для чисел, которые вы показали (только одна цифра после десятичной точки), лучшей идеей было быумножьте каждое число на 10, чтобы избежать потери точности, вызванной плавающей точкой.Это потребует написания вашей собственной процедуры преобразования «ASCII в целое число», которая делает вид, что десятичная точка находится в одном месте справа от того места, где она на самом деле находится.Это также сэкономит место, так как (для чисел, которые вы указали, где число не превышает 25,6), вы можете хранить их в массиве 8-битных целых чисел (символов).

Удачи вам в вашихдомашнее задание!

0 голосов
/ 08 мая 2011

Следующий код считывает данные с консоли stdin, обрабатывает числа в заданном вами формате и печатает их снова, чтобы можно было проверить правильность.

#include <stdio.h>

int main(int ac, char *av[])
{
    float a, b, c;
    scanf("%f # %f # %f", &a, &b, &c);
    printf("%f # %f # %f", a, b, c);
    printf("\n");
}

Хотя этот код работает, он работаетне очень крепкий.Это требует ТОЧНОЙ последовательности ' # ' символов между числами, и после последней цифры в строке допускается только символ новой строки.

Для более надежного решения вам нужно будет найти индекс символа началакаждого числа и сделайте fscanf в этом месте.

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