Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > перевод строки в массив double


Автор: antoshka1303 22.6.2008, 18:22
Всем привет! у меня вот такая задача.

Существует строка вида.
Код

0.232 0.64576 0.475

Нужно  считать эти цифры  в массив типа double, если заранее известно, сколько чисел в строке. То есть в данном случае размерность массива =3.
Всем заранее спасибо!!

Автор: rrrFer 22.6.2008, 18:29
antoshka1303
вариатов много, например записать строку в файл, а потом считать со спецификатором %f
можно парсить строку имхо это сложнее
а еще можно использовать строковый поток streangstream и приведение типа reinterpret_cast

Автор: Alexeis 22.6.2008, 19:55
Цитата(antoshka1303 @  22.6.2008,  17:22 Найти цитируемый пост)
Существует строка вида.

Если формат строго такой то парсинг очень простой
Код

    LPCSTR str = "0.232 0.64576 0.475";
    int c = 1;

    for (int i = 0; str[i] != '\0'; i++)
    {
       if (str[i] == ' ') c++;
    }

    double *mas = new double[c];

    int p = 0, d = 0;

    for (int i = 0; str[i] != '\0'; i++)
    {
       if (str[i] == ' ')
       {
          mas[d] = atof(&str[p]);
          p = i + 1;
          d++;
       }
    }

    mas[d] = atof(&str[p]);

Автор: bsa 23.6.2008, 10:26
antoshka1303, если не ошибаюсь, у тебя С++:
Код
#include <vector> //нужно для std::vector
#include <sstream> //нужно для stringstream
#include <algorithm> //нужно для std::copy
#include <iterator>   //нужно для back_inserter, istream_iterator и ostream_iterator
#include <iostream> //нужно для cout

const char *someString = "0.1234 0.4567 0.9876";

int main()
{
    //создаем динамический массив вещественных чисел двойной точности
    std::vector<double> array;
    //создаем поток с числами (если чтение производится из файла,
    //то можно вместо него использовать файловый поток)
    std::stringstream source(someString);
    //читаем все числа из созданного потока и помещаем в массив
    std::copy(std::istream_iterator<double>(source), std::istream_iterator<double>(), std::back_inserter(array));
    //тут можно уже что-то делать с массивом, например, можно вывести в столбик:
    std::copy(array.begin(), array.end(), std::ostream_iterator<double>(std::cout, "\n"));
    return 0;
}
Преимущество данного метода по сравнению с предыдущим:
1. отсутствие необходимости следить за памятью (т.е. делать в нужных местах delete)
2. не привязывает к определенной платформе.
3. короче (если убрать комментарии)
4. наглядней

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)