在main函数中,有不同模板类型的各种向量(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;
}
}
这是作业,但这个问题并不直接与作业的目标有关。 赋值在数据结构/算法类的堆上。
答案 0 :(得分:2)
实际上,您不能简单地将字符串转换为任意类型,您需要一些代码来解析和解释字符串的内容。 I / O库具有以下字符串流:
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))
>在读取行后检查文件状态,这样就不会再处理最后一行了。