В основной функции существуют различные векторы разных типов шаблонов (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;
}
}
Это домашнее задание, но эта проблема не относится непосредственно к цели задания. Назначение выполняется для кучи для структуры данных/класса алгоритмов.
В самом деле, вы не можете просто передать строку произвольному типу, вам понадобится некоторый код для синтаксического анализа и интерпретации содержимого строки. Для библиотеки ввода-вывода имеются потоки строк:
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))
проверяя состояние файла после прочтения строки, поэтому вы не обрабатываете последнюю строку дважды.