1

x、y、z を double 型として持つ構造体があります。行をスペースで分割し、その配列の値を構造体に入れようとしていますが、うまくいきません。

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

}

ありがとう

4

2 に答える 2

6

(意味のある)をとしてキャストすることはできませんが、ストリームからを抽出することはできます。char*doubledouble

入力行をスペースで分割しているため、典型的なイディオムは次のようになります...ファイル内の各行に対して、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;
        }
    }
}
于 2013-01-03T03:45:01.303 に答える
0

atoiを使用して整数に対して行うのと同じ方法です。

char *からdoubleに変換するには、単に:を使用します。

atof

atofの例

于 2013-01-03T03:28:37.060 に答える