【问题标题】:trouble : convert string to double麻烦:将字符串转换为双精度
【发布时间】:2014-01-02 10:33:57
【问题描述】:

当我将字符串转换为双变量时遇到问题。

#include<iostream>
#include<fstream>
#include<string.h>
#include<sstream>
#include<vector>


using namespace std;

int main(){
    int cols,rows;
    cols=6;rows=15;
    string line;
    string **value;
    double *conv;
    string *rowsis;
    int i_line=0;
    int i,j,k,a,l;
    j=0;
    double ***datV;
    vector <string> v;
    vector <string> nVal;
    string delimiter="  ";
    size_t pos=0;
    string token;
    ifstream fin("data/profil.data");
    while(getline(fin,line)){
        v.push_back(line);
        i_line++;
    }
    value=new string*[i_line];
    rowsis=new string[i_line];
    for(i=0;i<i_line;i+=18){
        a=1+i;
        rowsis[j]=v[i];
        value[j]=new string[rows];
        for(k=0;k<rows;k++){
            value[j][k]=v[a+k];
            while((pos=value[j][k].find(delimiter))!=string::npos){
                token=value[j][k].substr(0,pos);
                value[j][k].erase(0,pos+delimiter.length());
                nVal.push_back(token);
            }
            nVal.push_back(value[j][k]);
        }
        j++;
    }
    int limit=(j*rows-1)+(j*rows*cols);
    datV=new double**[i_line];
    conv=new double[limit];
    int b=0;
    for(i=1;i<limit;i++){
        stringstream vd(nVal[i]);
        vd>>conv[b];
        //view result variable conv
        cout<<conv[b];
        b++;
    }
    int c=0;
    for(i=0;i<j;i++){
        datV[i]=new double*[rows];
        for(k=0;k<rows;k++){
            datV[i][k]=new double[cols];
            for(l=0;l<cols;l++){
                datV[i][k][l]=conv[c];
                //cout<<datV[i][k][l]<<" ";
                c++;
            }
            //cout<<endl;
        }
        //cout<<endl<<endl;
    }
    return 0;
}

和这样的配置文件数据:

normal
    -1  -1  63  -3  -1  0
    0   0   62  -3  -1  0
    -1  -1  61  -3  0   0
    -1  -1  63  -2  -1  0
    -1  -1  63  -3  -1  0
    -1  -1  63  -3  -1  0
    -1  -1  63  -3  0   0
    -1  -1  63  -3  -1  0
    -1  -1  63  -3  -1  0
    -1  -1  61  -3  0   0
    -1  -1  61  -3  0   0
    -1  -1  64  -3  -1  0
    -1  -1  64  -3  -1  0
    -1  -1  60  -3  0   0
    -1  0   64  -2  -1  0


normal
    -1  -1  63  -2  -1  0
    -1  -1  63  -3  -1  0
    -1  -1  61  -3  0   0
    0   -4  63  1   0   0
    0   -1  59  -2  0   -1
    -3  3   57  -8  -3  -1
    -1  3   70  -10 -2  -1
    0   -3  61  0   0   0
    0   -2  53  -1  -2  0
    0   -3  66  1   4   0
    -3  3   58  -10 -5  0
    -1  -1  66  -4  -2  0
    -1  -2  67  -3  -1  0
    0   1   66  -6  -3  -1
    -1  -1  59  -3  -4  0

nVal 存储字符串字符。 nVal[i] 结果为:

-1-163-3-100062-3-10-1-161-300

现在 conv[b] 是:

-1-163-3-10*0*0062-3-10*0*-1-161-300*0*

nVal转换时添加了0个值,如何删除0个值?

请帮忙?\

【问题讨论】:

  • 注意,如果你想使用std::string,你应该#include &lt;string&gt;

标签: c++ string file text double


【解决方案1】:

尝试使用 atof

例子

#include <stdlib.h>

int main()
{
    string word;  
    openfile >> word;
    double lol = atof(word.c_str()); 
    return 0;
}

【讨论】:

  • @BoBTFish 似乎他正在使用旧的编译器 - 字符串包含在 string.h 中
  • @Nazar554 我以为应该是&lt;cstring&gt;
  • @Yanshof 是的,但是你如何区分失败和成功读取 0?
  • 我认为 '\n' 中的 0 表示,但在打印出变量 nVal[i] 时未显示。
  • 我希望 datV[i][k][l] 应该包含 3D 双精度数组,但 '\n' 无法使用条件验证 if (nVal[i]=='\n')
【解决方案2】:

我不得不尝试一些实验,最后我找到了解决方案:

for(i=1;i<limit;i++){
        stringstream vd(nVal[i]);
        if(!(vd>>conv[b])){
            b-=1;
        }
        vd>>conv[b];
        b++;
    }

谢谢大家。 :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多