2013-01-03 58 views
1

我有一个结构与x,y,z作为类型双。我试图通过空格拆分这些行,然后将该数组的值放入我的结构中,但它无法工作,有人可以告诉我该怎么办?如何将char *转换为双精度?

#include "_externals.h" 
#include <vector> 

typedef struct 
{ 
    double X, Y, Z; 
} p; 

p vert = { 0.0, 0.0, 0.0 }; 

int main() 
{ 
    char *path = "C:\\data.poi";  

    ifstream inf(path); 
    ifstream::pos_type size; 
    inf.seekg(0, inf.end); 
    size = inf.tellg(); 

    double x, y, z; 
    char *data; 

    data = new char[size]; 
    inf.seekg(inf.beg); 
    inf.read(data, size); 
    inf.seekg(inf.beg); 

    char** p = &data; 
    char *line = *p;  

    for (int i = 0; i < strlen(data); ++i) 
    { 
     const char *verts = strtok(line, " "); 

     //this isnt working 
     vert.X = verts[0]; 
     vert.Y = verts[1]; 
     vert.Z = verts[2]; 

     ++*line; 
    } 

} 

感谢

+0

什么是绿党? – soandos

+0

你的数据文件每行3倍,每个文件用空格分隔吗?只是好奇。 – WhozCraig

+0

扁豆... – Potatoswatter

回答

0

你会做它用的atoi整数相同的方式。

对于来自焦炭*转换翻一番,只需使用:

ATOF

atof example

+0

或'strtod()'...错误处理更好用'strtod()'。 –

6

你不能(有意义)一个char*double,但你可以从提取到一个double

由于您将输入行分割为空格,因此典型的习惯用法如下...对于文件中的每一行,创建一个istringstream对象并使用它填充您的结构。

如果operator >>()失败(例如,如果输入的字母在预期数字的位置输入),目标值将保持不变并且failbit已设置。

例如:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 

struct coords 
{ 
    double X, Y, Z; 
}; 


int main() 
{ 
    std::ifstream inf("data.poi"); 
    std::vector<coords> verts; 
    std::string line; 
    while (std::getline(inf, line)) 
    { 
     std::istringstream iss(line); 
     coords coord; 

     if (iss >> coord.X >> coord.Y >> coord.Z) 
     { 
      verts.push_back(coord); 
     } 
     else 
     { 
      std::cerr << "Could not process " << line << std::endl; 
     } 
    } 
} 
+0

+1不错的解决方案。我很好奇:因为在给定行上的前三个有效双打之后的任何内容都被丢弃了,您是否可以将当前的'if'子句提取从'inf'移出主要提取,完全放弃'istringstream',并立即在'verts.push_back()'做一个'std :: getline(inf,junk)'之后吃/抛弃剩下的行? (因为它被忽略?)。就是想。 – WhozCraig

+0

@WhozCraig:我不确定这会起作用(肯定会让报告“无效”行更难)。如果这是我自己的代码,我可能会提取一个允许'if(iss >> coord)'的istream'operator'',但我认为我提供的示例足以回答问题。 OP如何选择使用它是他们自己的担忧。 :) – Johnsyweb

+1

它肯定超出了。我只是好奇而已。我永远不会记得,如果一个成功的提取紧跟在newline/whitespace之后,会消耗换行符/空白,这是我能看到的唯一导致问题的地方。再次,非常好的解决方案。谢谢你的时间。 – WhozCraig