将字符串从getline转换为数字

时间:2014-06-02 07:40:28

标签: c++

我正在尝试使用矢量创建一个2D数组。我有一个文件,每行有一组数字。所以我做了什么我实现了一个split函数,每当我有一个新的数字(由\t分隔)时,它会将其拆分并将其添加到向量

vector<double> &split(const string &s, char delim, vector<double> &elems) {
    stringstream ss(s);
    string item;
    while (getline(ss, item, delim)) {
        cout << item << endl;
        double number = atof(item.c_str());
        cout << number;
        elems.push_back(number);
    }
    return elems;
}


vector<double> split(const string &s, char delim) {
    vector<double> elems;
    split(s, delim, elems);
    return elems;
}

之后我简单地遍历它。

int main()
{
    ifstream file("./data/file.txt");
    string row;
    vector< vector<double> > matrix;

    int line_count = -1;
    while (getline(file, row)) {
        line_count++;
        if (line_count <= 4) continue;
        vector<double> cols = split(row, '\t');
        matrix.push_back(cols);
    }
...
}

现在我的问题就在这里:

   while (getline(ss, item, delim)) {
        cout << item << endl;
        double number = atof(item.c_str());
        cout << number;

其中item.c_str()转换为0.这不应该是一个与item具有相同值的字符串吗?如果我直接从字符串到c_string,它可以在一个单独的示例上工作,但是当我使用此getline时,我最终会遇到此错误情况,

提示?

1 个答案:

答案 0 :(得分:1)

而不是使用atof使用stringstream

while(!ss.eof())
{
    double number;
    ss>>number;
}

编辑: 我已经更新了你的分割功能并删除了多余的回报。

void split(const string &s, vector<double> &elems) {
    stringstream ss(s);
    while (!ss.eof()) {
        double number;
        ss >> number;
        cout << number;
        elems.push_back(number);
    }

}

int main()
{
    std::vector<double> columns;
    split("1.32\t1.65\t1.98456\t2.34",columns);
    return 0;
}