Мне нужна помощь с анализом файла в C ++ - PullRequest
1 голос
/ 23 марта 2011

Хорошо, поэтому в основном у меня есть этот текстовый файл с цифрами и буквами, который должен представлять вершины многоугольника.Эта часть не важна, потому что у меня проблемы с анализом файла в int.Пока что функция выглядит так:

    void parseModel(void)
{
    int num_vertices, num_faces;
    char data[255];
    ifstream ifs("rect-skinny.d");
    ifs.getline(data, 255);
    istrstream ins(data);
    ins >> num_vertices;
    cout << num_vertices << endl;
    ifs.close();
}

Я пробовал много разных методов, которые давали разные, но неправильные ответы.Этот выводит номер -858993460 по некоторым причинам.В других случаях он просто выводил бы закрытые скобки, когда я пытался печатать данные отдельно.Я не могу понять, что я делаю не так, потому что кажется, что это должно сработать.Входной файл:

 data    8    6
 -0.5   1.0   0.3
 0.5   1.0   0.3
 0.5   -1.0   0.3
 -0.5   -1.0   0.3
 -0.5   1.0   -0.3
 0.5   1.0   -0.3
 0.5   -1.0   -0.3
 -0.5   -1.0   -0.3
   4   1   2   3   4
   4   1   5   6   2
   4   2   6   7   3
   4   5   8   7   6
   4   1   4   8   5
   4   3   7   8   4

По сути, все, что я сейчас пытаюсь сделать, это получить первую строку и поместить эти числа в нее в num_vertices и num_faces соответственно.

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

После прочтения текстовой строки «data» она будет содержать «data 8 6».

Строка ins >> num_vertices; попытается прочитать целое число, но найдет "data 8 6" и потерпит неудачу. Попробуйте что-то вроде этого:

void parseModel(void)
{
    int num_vertices, num_faces;
    char data[255];
    std::ifstream ifs("rect-skinny.d");
    ifs.getline(data, 255);       // data contains "data    8    6"
    std::istrstream ins(data);    // ins  contains "data    8    6"
    ins.ignore(4, ' ');           // ins  contains "    8    6"
    ins >> num_vertices;
    std::cout << num_vertices << endl;
    ifs.close();
}
1 голос
/ 23 марта 2011

Вот как бы я подошел к проблеме ....

Если это не удается, вы можете просто организовать свой файл с возвратом после каждого фрагмента данных. Ваша жизнь будет бесконечно легче, и ваши данные будут в массиве в любом случае.

Если вы действительно настроены на использование массивов символов, вы можете просто изменить строку на массив символов.

void parseModel(void)
{
    //will read in heading data first, then parse model data
    //you could alternatively store your header data in a struct
    //or class for better organization

    //work with strings, not raw char arrays
    string data;
    int num_vertices;
    int num_faces;

    //open the stream
    ifstream ifs("rect-skinny.d");
    if(!ifs.is_open())
    {
        cout << "ERROR- ifstream NOT OPEN\n";
    }

    //read in heading data
    ifs >> data;
    ifs >> num_vertices;
    ifs >> num_faces;

    //array of vertex data
    float vertices[num_vertices];
    //array of faces data
    int   faces[num_faces];

    //loop through all the vertices, reading each into the array
    for(int i = 0; i < num_vertices; i++)
    {
        ifs >> vertices[i];
    }
    //do the same for the faces
    for(int n = 0; n < num_faces; n++)
    {
        ifs >> faces[n];
    }
    //closing the stream
    ifs.close();
}
0 голосов
/ 23 марта 2011

Вы можете рассмотреть возможность использования fscanf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...