Поскольку он помечен как C ++, наиболее очевидным способом было бы использование потоков. С макушки головы, что-то вроде этого может сделать:
std::vector<float> readFile(std::istream& is)
{
char chdummy;
is >> std::ws >> chdummy >> std::ws;
if(!is || chdummy != '*') error();
std::string strdummy;
std::getline(is,strdummy,':');
if(!is || strdummy != "SZA") error();
std::vector<float> result;
for(;;)
{
float number;
if( !is>>number ) break;
result.push_back(number);
}
if( !is.eof() ) error();
return result;
}
Почему float
, кстати? Обычно double
намного лучше.
Редактировать , так как был задан вопрос, является ли хорошая идея возврата копии vector
:
Для первого решения я бы, конечно, сделал очевидное. Функция - это , считывающая файл в vector
, и наиболее очевидная вещь, которую должна сделать функция - это вернуть свой результат. Приводит ли это к заметному замедлению, зависит от многих вещей (размер вектора, как часто вызывается функция и откуда, скорость диска, с которого она считывает, может ли компилятор применять RVO). Я бы не хотел испортить очевидное решение оптимизацией, но если профилирование действительно показывает, что это слишком медленно, вектор должен быть передан по неконстантной ссылке.
(Также обратите внимание, что C ++ 1x с поддержкой rvalue, который, как мы надеемся, скоро будет доступен с помощью ближайшего к вам компилятора, сделает этот дискуссионный вопрос спорным, поскольку он предотвратит копирование вектора после возвращения из функции.)