Ввод типа файла ввода в векторный тип в C ++

0

В основной функции существуют различные векторы разных типов шаблонов (float, int, char *). Эта функция вызывается для чтения в форматированном входе из разных файлов для заполнения каждого вектора. Моя проблема исходит из преобразования типов, поскольку

v.push_back((T)(pChar));

не нравится преобразовывать char * в float (предположительно из-за десятичной точки).

Вопрос: Есть ли способ получить правильные преобразования независимо от типа данных, если входной файл является подходящим? (Я рассматривал typeid(), но не продаюсь от его использования)

template <class T>
void get_list(vector <T> & v, const char * path)
{
    fstream file;
    const char delim[1]{' '};
    char line[512];
    char * pChar;

    file.open(path, ios_base::in);
    if (file.is_open())
    {
        while (!file.eof())
        {
            file.getline(line, 512);
            pChar = strtok(line, delim);
            while (pChar != NULL)
            {
                v.push_back(pChar);
                pChar = strtok(NULL, delim);
            }
        }
        file.close();
    }
    else
    {
        cout << "An error has occurred while opening the specified file." << endl;
    }
}

Это домашнее задание, но эта проблема не относится непосредственно к цели задания. Назначение выполняется для кучи для структуры данных/класса алгоритмов.

Теги:
casting

1 ответ

2
Лучший ответ

В самом деле, вы не можете просто передать строку произвольному типу, вам понадобится некоторый код для синтаксического анализа и интерпретации содержимого строки. Для библиотеки ввода-вывода имеются потоки строк:

std::stringstream ss(pChar);
T value;
ss >> value;
v.push_back(value);

Это будет работать для всех типов, которые имеют >> перегрузку, включая все встроенные числовые типы, такие как float.

Кроме того, вы можете избавиться от неприятного токениза C-стиля:

T value;
while (file >> value) {
    v.push_back(value);
}

или

std::copy(
    std::istream_iterator<T>(file), 
    std::istream_iterator<T>(),
    std::back_inserter(v));

По крайней мере, измените цикл на

while (file.getline(line, 512))

проверяя состояние файла после прочтения строки, поэтому вы не обрабатываете последнюю строку дважды.

  • 0
    +1 за объяснение всех возможных способов ...
  • 0
    Огромное спасибо. Я не знал о классе stringstream.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню