Массив строк в C ++ - PullRequest
       11

Массив строк в C ++

0 голосов
/ 26 апреля 2011

Я пытаюсь перевести на C ++ небольшую имеющуюся у меня программу на Python, которая открывает файл OBJ и записывает необходимые данные в классы FACES и VERTS.В программе Python она просто просматривает каждую строку и разбивает их на токены, разделенные пробелами.Если строка начинается с буквы «f», последующими токенами будут данные для лиц.Для "v", положение вертов.Для "vt", УФ информация.нормали "vn" для вертов.

До сих пор я мог сделать строку для открытия строки.Но пройти каждую строку и затем записать их в массив строк (массив символов), так сложно.Некоторая помощь, пожалуйста.

Вот пример того, с чего я должен начать:

FILE * pFile;
char myString[100];
pFile = fopen(filename, "r");
while(fgets(myString, 100, pFile)!=NULL) {
        char *sep;
        int counter = 0;
        int mode = 0;
        sep = strtok(myString, " ");
        while (sep != NULL) {
            if (strncmp(sep,"f",1)==0) {
                mode = 4;
            } else {
            if (strncmp(sep,"vn",2)==0) {
                mode = 3;
            } else {
            if (strncmp(sep,"vt",2)==0) {
                mode = 2;
            } else {
            if (strncmp(sep,"v",2)==0) {
                mode = 1;
            }else {

            }
            }
            }
            }
            switch (mode) {
                case 1 :{
                    // vertex position
                    break;
                }
                case 2 :{
                    cout << sep << " --> vertex normal" << endl;
                    break;
                }
                case 3 :{
                    cout << sep << " --> vertex UV" << endl;
                    break;
                }
                case 4 :{
                    cout << sep << " --> face " << endl;
                    break;
                }
            }
            sep = strtok(NULL, " ");
            counter++;
        } 
    }

Вместо "SWITCH", в котором ранее устанавливались переменные для "MODE", я бы предпочелесть что-то простое, как:

   def openFile(self, filename):
    faceCount = 0
    for line in open(filename, "r"):
        vals = line.split()
        if len(vals) > 0:
            if vals[0] == "v":
                v = map(float, vals[1:4])
                self.verts.append(Point(v[0], v[1], v[2]))
            if vals[0] == "vn":
                n = map(float, vals[1:4])
                self.norms.append(Normal(n[0], n[1], n[2]))
            if vals[0] == "vt":
                vt = map(float, vals[1:3])
                self.text.append(UV(vt[0], vt[1]))

            if vals[0] == "f":
                vertsOut = []
                normsOut = []
                textOut = []
                for f in vals[1:]:

                    w = f.split("/")
                    # OBJ Files are 1-indexed so we must subtract 1 below
                    try:
                        vertsOut.append(self.verts[int(w[0])-1])
                    except:
                        print "Issue with Position of Face %s " % faceCount
                    try:
                        textOut.append(self.text[int(w[1])-1])
                    except:
                        print "Issue with UV of Face %s " % faceCount
                    try:
                        normsOut.append(self.norms[int(w[2])-1])
                    except:
                        print "Issue with Normal of Face %s " % faceCount

                    self.verts[int(w[0])-1].addFace(faceCount)

                self.faces[faceCount]= Face(vertsOut,normsOut,textOut)
                faceCount += 1

Но это PYTHON.Там намного проще.Пожалуйста помоги.Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Сначала объявляем массив строк (массив массивов символов). Вы можете объявить static, чтобы избежать перераспределения.

char *array[100] //Supposing you need 100 positions in the array

Тогда

switch (mode) {
                case 1 :{
                    // vertex position
                    array[counter] = strdup(myString);
                    break;
                }
0 голосов
/ 26 апреля 2011

анализ OBJ может быть болезненным;Вы должны смотреть на stringstream объектов.Просто для краткого примера использования бетона для ваших нужд:

//Read the .obj file line by line
std::string line;
float x, y, z;
std::vector<Vertex> vertices;
std::vector<Face>   faces;
while (std::getline(file_in, line))
{
    std::istringstream stream (line);
    std::string line_token;
    stream  >> line_token;

    if(line_token == "v")
    {
        stream >> x >> y >> z;
        vertices.push_back(Vertex(x,y,z));
    }
    //manage normals & tangents (vn & vt) the exact same way

    else if(line_token == "f")
    {
        Face f;
        FaceVertex vtx;
        int tmp_v;
        while (stream >> tmp_v)
        {
            //Store the vertex index
            vtx.setID(--tmp_v); //-- vector index starts at 0
            char c = 0;
            std::string elt;
            stream >> elt;
            //Assert that the next char is "/"
            if (elt [0] == '/')
            {
                if (elt [1] == '/')
                {
                    elt.erase(0, 2);
                    std::istringstream part_stream(elt);
                    //Store the Vertex Normal
                    part_stream >> tmp_v;
                    vtx.setNormalID(--tmp_v);
                }
                else
                {
                    elt.erase(0, 1);
                    std::istringstream part_stream(elt);
                    //Store the VertexUV index
                    part_stream >> tmp_v;
                    vtx.setUVID(--tmp_v);
                    c = 0;
                    part_stream >> c;
                    if(c == '/')
                    {
                        part_stream >> tmp_v;
                        vtx.setNormalID(--tmp_v);
                    }
                }
            }
            f.addVertex(vtx);
        }
        faces.push_back(f)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...