C ++ линия в вектор - PullRequest
       7

C ++ линия в вектор

4 голосов
/ 30 ноября 2010

Ух ты, я сегодня был повсюду с вопросами, и я прошу прощения, если они, кажется, совпадают, но для каждого вопроса возникает другой вопрос ... Так как одна вещь не будет работать ......, но я должен использовать что-тоеще ...... и т. д.

В любом случае, у меня есть текстовый файл:

6
3.0 2.5 -1.5 0.0 1.7 4.0
6 10

6 - это число "float" во второй строке (3.0,2.5 и т. д....) 3.0,2.5, -1.5 - все серии поплавков.6 и 10 - это просто 2 целых числа.

У меня есть вектор

std::vector<double> numbers;

Все, что мне нужно сделать, - это поместить вторую строку в числа.Итак, прямо сейчас у меня есть

ifstream myfile (filename.c_str());

Я могу просто сделать myfile >>, чтобы получить первое значение (6), но как мне поместить вторую строку в моем векторе?Помните, я ТОЛЬКО знаю, насколько велика строка 2, читая в первой строке (в данном случае 6).

Кроме того, последние 2 числа не должны быть в этом векторе, а два отдельных значения.Что я могу просто сделать myfile >> a >> b.

Снова прошу прощения за ооочень много вопросов.но я буквально искал везде и задавал, вероятно, неправильные вопросы.

Ответы [ 4 ]

5 голосов
/ 30 ноября 2010
myfile >> numElements;
numbers.resize(numElements);
for (int i = 0; i < numElements; i++) {
    myfile >> numbers[i];
}
myfile >> a >> b;
1 голос
/ 30 ноября 2010

У вас есть copy_n() в вашем арсенале?

template<class In, class Size, class Out>
Out copy_n(In first, Size n, Out result)
{
    while( n-- ) *result++ = *first++;
    return result;
}

Поместите это куда-нибудь, где вы можете легко # включить его в другие единицы перевода. Это полезно Используйте это так, чтобы скопировать ваши n значения с плавающей точкой:

copy_n(std::istream_iterator<double>(std::cin),
       n,
       std::back_inserter(v));
1 голос
/ 30 ноября 2010

Я собираюсь начать с того момента, когда вы уже прочитали строку из файла, поскольку кажется, что вы в порядке с этим. Это самый основной подход. Мой код ниже иллюстрирует этот подход с использованием очень простого кода, который можно использовать, чтобы понять, как это работает.

  1. Получите строку, которую вы хотите проанализировать в string, это line в моем коде ниже.
  2. Поиск в string токенов, где каждый токен отделен от всего, что не является ни цифрой, ни десятичным, ни отрицательным знаком
  3. Для каждого токена преобразуйте строку в double, используя stringstream.
  4. Добавьте преобразованный двойник к вашему вектору

В конце цикла я также вывожу вектор на экран для проверки.

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    string line = "3.0 2.5 -1.5 0.0 1.7 4.0";
    vector<double> doubles;

    string::size_type n_begin = 0;
    string::size_type n_end = line.find_first_not_of("-.0123456789", n_begin);
    while( n_begin != string::npos )
    {
        string cur_token = line.substr(n_begin, n_end-n_begin);
        stringstream ss;
        ss << cur_token;
        double cur_val = 0.0;
        ss >> cur_val;
        doubles.push_back(cur_val);
        // set up the next loop
        if( n_end == string::npos )
            n_begin = n_end = string::npos;
        else
        {
            n_begin = n_end + 1;
            n_end = line.find_first_not_of("-.0123456789", n_begin);
        }
    }

    copy(doubles.begin(), doubles.end(), ostream_iterator<double>(cout, "\n"));
}
1 голос
/ 30 ноября 2010

что-то вроде:

int count, a, b;
double tmp;
std::vector<double> numbers;
ifstream myfile (filename.c_str());
myfile >> count;
for(int i = 0; i < count; ++i) {
    myfile >> tmp; numbers.push_back(tmp);
}
myfile >> a >> b;
...