Читать числа и конвертировать их в двойники? - PullRequest
1 голос
/ 27 октября 2009

Хорошо, у меня довольно неприятная проблема: одно из приложений, которые мы используем hdp, выводит значения HDF в текстовый файл.

Итак, в основном у нас есть текстовый файл, состоящий из этого:

-8684 -8683 -8681 -8680 -8678 -8676 -8674 -8672 -8670 -8668 -8666 
-8664 -8662 -8660 -8657 -8655 -8653 -8650 <trim... 62,000 more rows>

Каждый из них представляет двойное число: E.g.:

-8684 = -86.84

Мы знаем, что значения будут между 180 -> -180. Но мы также должны обработать около 65 000 строк этого. Так что время очень важно.

Какой лучший способ справиться с этим? (я не могу использовать Boost или любую другую библиотеку из-за внутренних стандартов)

Ответы [ 2 ]

4 голосов
/ 27 октября 2009

Как хотите, вместо ответа ...:)

Разве вы не можете просто использовать стандартный iostream?

double val; cin >> &val; val/=100;

полоскание, повтор 62000 * 11 раз

0 голосов
/ 27 октября 2009

Я думаю, что сделал бы работу немного по-другому. Я бы создал небольшой класс sorta-proxy для обработки чтения значения и преобразования его в double:

class fixed_point { 
    double val;
public:
    std::istream &read(std::istream &is) { 
        is >> val; val /= 100.0; return is;
    }
    operator double() { return val; }
    friend std::istream &operator>>(std::istream &is, fixed_point &f) {
        return f.read(is);
    }
};

Используя это, я мог бы читать мои данные немного чище. Например:

std::vector<double> my_data;
std::copy(std::istream_iterator<fixed_point>(infile), 
          std::istream_iterator<fixed_point>(),
          std::back_inserter(my_data));

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

Есть и другие способы сделать эту работу. Например, вы могли бы также создать производную от std :: num_get, которая анализирует удваивается от формата этого файла. Вероятно, это теоретически правильно, но документация для этой части библиотеки в основном довольно скудная, поэтому мне трудно посоветовать ее.

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