在C ++中键入转换文件输入到矢量类型

时间:2014-11-13 07:59:32

标签: c++ casting

在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;
    }
}

这是作业,但这个问题并不直接与作业的目标有关。 赋值在数据结构/算法类的堆上。

1 个答案:

答案 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))
在读取行后检查文件状态,这样就不会再处理最后一行了。