2013-01-03 160 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