Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
#1

Считывание obj файла - C++

01.11.2012, 23:29. Просмотров 1646. Ответов 13
Метки нет (Все метки)

Предыстория 2 месяца прошло с тех пор как я застрял на том что не могу згрузить 3D модель в OpenGl проект.
Я делал конвертеры ("загрузчики") сам 3 совершенно разные версии. Не помогло. Прошу помощь у вас разработать программу или хотябы алгоритм считывание OBJ файла и преобразовние его в код для OpenGl

Задачи:
Есть OBJ файл. Строиться по типу: " v X Y Z " много таких строк (вершин)
потом идут " f 1//1 2//2 5//5 " типа 1 вершина соединяется со 2ой и с 5 (к примеру)
потом опят v и f
Основная задача этот файл преобразовать в код такого типа

glBegin(GL_POLYGON);
glVertex3d(X,Y,Z);
glVertex3d(X,Y,Z);
glVertex3d(X,Y,Z);
glEnd();
glBegin(GL_POLYGON);
...
glEnd();
И результат вписать в файлик txt
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 23:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание obj файла (C++):

Заменить считывание с клавиатуры на считывание из файла - C++
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что делать. Почитал в интернете, попробовал, не...

Увеличение скорости загрузки из файла obj мешей в Directx - C++
Пробую написать свой класс для загрузки .obj мешей в Directx. Идея в 2 функциях: Первая(Convert_Obj) конвертирует стандартный формат...

как overload ++OBJ и --OBJ - C++
как overload ++OBJ и --OBJ

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Считывание из файла - C++
как считать из файла число, в котором оно будет задаваться в виде ASCII графики где белый цвет обозначен символом ".", светло-серый - "%",...

Считывание с файла - C++
#Oblast1 g;ergtr hwtrh rt h trh ert h hry e #Oblast2 oooooooqwe qweeeeeeeeee qweeeeeeeee #Oblast3 3333333333

13
nonedark2008
914 / 653 / 135
Регистрация: 28.07.2012
Сообщений: 1,764
01.11.2012, 23:50 #2
Помнится делал что-то такое, но кода не сохранилось. Если я не ошибаюсь, то в obj файле содержатся вершины, а далее идут по тройках индексы вершин(ака треугольники). Также там могут быть нормали и куча другого хлама. Основная идея в том, что ты эту всю радость загружаешь в массивы(А лучше сделать класс примитива, который будет загружать в себя из obj), а имея массивы вершин, индексов, нормалей просто вызываешь функцию рисования, если память не врет, то нужно использовать функции на подобии glVertexPointer, glDrawElements и т.п. там их много.

Добавлено через 1 минуту
По использованию этих функций кури MSDN.
0
Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
01.11.2012, 23:57  [ТС] #3
Вы не поняли суть.
Вопрос состоит в организации чтения файла и т.д.
А про OpenGl я более менее знаю
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
02.11.2012, 00:41 #4
А зачем тогда вообще OpenGL упомянать? Что не получается? Читать файл?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 07:49 #5
Цитата Сообщение от lazybiz Посмотреть сообщение
А зачем тогда вообще OpenGL упомянать? Что не получается? Читать файл?
Я так понял:
Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
Основная задача этот файл преобразовать
Задача расплывчата.

Добавлено через 1 минуту
Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
Есть OBJ файл. Строиться по типу: " v X Y Z " много таких строк (вершин)
И что с такими строками делать?

Цитата Сообщение от Anatoliy Coder Посмотреть сообщение
потом идут " f 1//1 2//2 5//5 "
И что с этими строками делать? Конкретизировать задачу нужно.
0
Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
02.11.2012, 20:09  [ТС] #6
Ладно. Упрошу задачу.
Допустим у меня уже есть Vertexes.txt такого вида:
C++
1
2
3
4
5
6
7
8
9
10
/* 1 */  glVertex3d(-2.092190,0.000000,0.697396);
/* 2 */  glVertex3d(2.927495,0.000000,0.697396);
/* 3 */  glVertex3d(-2.092190,0.000000,-2.282672);
/* 4 */  glVertex3d(2.927495,0.000000,-2.282672);
/* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
/* 6 */  glVertex3d(2.927495,1.609770,0.697396);
/* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
/* 8 */  glVertex3d(2.927495,1.609770,-2.282672);
/* 9 */  glVertex3d(1.774041,2.909065,1.812822);
/* 10 */  glVertex3d(1.774041,2.853168,1.245292);
P.S. то, что между "/*" и "*/" - это число означает номер точки.

И есть файл Poligons.txt такого вида:
C++
1
2
3
4
5
6
7
8
1.5.9;
13.13.14;
13.13.103;
16.16.103;
14.14.15;
14.14.104;
103.103.104;
103.103.105;
P.S. А эти цифры означают какую точку с какой точкой соединять.

Вопрос: каким образом мне нужно считать эти оба файла, чтобы потом записать в третий файл данные такого типа.
C++
1
2
3
/* 1 */  glVertex3d(-2.092190,0.000000,0.697396);
/* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
/* 9 */  glVertex3d(1.774041,2.909065,1.812822);
Ещё раз конкретизируЮ: как взять через цыфры из фала Poligons.txt и по номеру цыфры вписать в третии файл нужную верщину.

P.S. В первом файле номер строки не всегда равен номеру элемента, так что искать верщину по номеру строки "невар"
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.11.2012, 23:49 #7
Например, такой код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// 3   glVertex3d(-2.092190,0.000000,0.697396);
// 2   glVertex3d(2.927495,0.000000,0.697396);
// 1   glVertex3d(-2.092190,0.000000,-2.282672);
// 8   glVertex3d(2.927495,0.000000,-2.282672);
// 5   glVertex3d(-2.092190,1.609770,0.697396);
// 6   glVertex3d(2.927495,1.609770,0.697396);
// 7   glVertex3d(-2.092190,1.609770,-2.282672);
// 4   glVertex3d(2.927495,1.609770,-2.282672);
// 10  glVertex3d(1.774041,2.909065,1.812822);
// 9   glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// 1 glVertex3d(-2.092190,0.000000,-2.282672);
// 1 glVertex3d(-2.092190,0.000000,-2.282672);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 1 glVertex3d(-2.092190,0.000000,-2.282672);
// 5 glVertex3d(-2.092190,1.609770,0.697396);
// 9 glVertex3d(1.774041,2.853168,1.245292);
// 2 glVertex3d(2.927495,0.000000,0.697396);
// 2 glVertex3d(2.927495,0.000000,0.697396);
// 9 glVertex3d(1.774041,2.853168,1.245292);
// 3 glVertex3d(-2.092190,0.000000,0.697396);
// 3 glVertex3d(-2.092190,0.000000,0.697396);
// 5 glVertex3d(-2.092190,1.609770,0.697396);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 5 glVertex3d(-2.092190,1.609770,0.697396);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 4 glVertex3d(2.927495,1.609770,-2.282672);
// 10 glVertex3d(1.774041,2.909065,1.812822);
// 6 glVertex3d(2.927495,1.609770,0.697396);
// 6 glVertex3d(2.927495,1.609770,0.697396);
// 10 glVertex3d(1.774041,2.909065,1.812822);
// 8 glVertex3d(2.927495,0.000000,-2.282672);
// 8 glVertex3d(2.927495,0.000000,-2.282672);
// 10 glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
void f1(int x, ifstream &fver, ofstream &fout)
{
    int n;
    string str;
    
    while (true)
    {
        fver >> n;
        if (n == x) 
        {
            fver >> str;
            fout << n << ' ' << str << endl;
            fver.clear();
            fver.seekg(0);
            break;
        }
        else
        {
            fver.ignore(255, '\n');
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
 
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        fpol >> x;
        fpol.clear();
        fpol.get();
        fpol >> y;
        fpol.clear();
        fpol.get();
        fpol >> z;
        fpol.clear();
        fpol.get();
        
        f1(x, fver, fout);
        f1(y, fver, fout);
        f1(z, fver, fout);
    }
    
    fpol.close();
    fver.close();
    fout.close(); 
    
    system("pause");
    return 0;
}
Поясните насчёт этого: /* 1 */. Так в файле или вы закоментировали?

Добавлено через 25 минут
Если же номера точек в файле в коментах, то:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// /* 3 */  glVertex3d(-2.092190,0.000000,0.697396);
// /* 2 */  glVertex3d(2.927495,0.000000,0.697396);
// /* 1 */  glVertex3d(-2.092190,0.000000,-2.282672);
// /* 8 */  glVertex3d(2.927495,0.000000,-2.282672);
// /* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
// /* 6 */  glVertex3d(2.927495,1.609770,0.697396);
// /* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
// /* 4 */  glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 9 */  glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
 
void f1(int x, ifstream &fver, ofstream &fout)
{
    int n;
    string str;
    
    while (true)
    {
        fver.seekg(2, ios::cur); // попасть на пробел перед номером точки
        fver >> n;
        //fver.clear();
        fver.seekg(3, ios::cur); // попасть на пробел перед записью функции
        if (n == x) 
        {
            fver >> str;
            fout << "/* " << n << " */ " << str << endl;
            fver.clear();
            fver.seekg(0);
            break;
        }
        else
        {
            fver.ignore(255, '\n');
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
    
 
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        fpol >> x;
        fpol.clear();
        fpol.get();
        fpol >> y;
        fpol.clear();
        fpol.get();
        fpol >> z;
        fpol.clear();
        fpol.get();
        
        f1(x, fver, fout);
        f1(y, fver, fout);
        f1(z, fver, fout);
    }
    
    fpol.close();
    fver.close();
    fout.close();
 
    system("pause");
    return 0;
}


Добавлено через 5 минут
Добавить
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
03.11.2012, 00:09 #8
Напишите, как эти данные точно хранятся. Если просто 3 подряд значения типа double, то создайте структуру:
C++
1
2
3
4
5
struct coord {
   double x;
   double y;
   double z;
};
Соединения тоже можно хранить в структуре, в виде указателей.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.11.2012, 00:14 #9
Anatoliy Coder, хочу спросить. В чем смысл данного действия?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.11.2012, 02:42 #10
Еще вариант:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// /* 3 */  glVertex3d(-2.092190,0.000000,0.697396);
// /* 2 */  glVertex3d(2.927495,0.000000,0.697396);
// /* 1 */  glVertex3d(-2.092190,0.000000,-2.282672);
// /* 8 */  glVertex3d(2.927495,0.000000,-2.282672);
// /* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
// /* 6 */  glVertex3d(2.927495,1.609770,0.697396);
// /* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
// /* 4 */  glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 9 */  glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
#include <cctype>
using namespace std;
 
void f1(int x, ifstream &fver, ofstream &fout, int flag = 0)
{
    int n;
    string str;
    
    while (true)
    {
        fver.seekg(2, ios::cur);
        fver >> n;
        fver.seekg(3, ios::cur);
        if (n == x) 
        {
            fver >> str;
            fout << "/* " << n << " */ " << str;
            if (flag == 0) fout << endl;
            fver.clear();
            fver.seekg(0);
            break;
        }
        else
        {
            fver.ignore(255, '\n');
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
void f2(istream& fpol)
{
    while (true)
    {
        if (isdigit(fpol.peek()) || fpol.peek() == EOF) break;
        fpol.seekg(1, ios::cur);
    }
}
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
    int flag = 0;
    
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        f2(fpol);
        fpol >> x;
        fpol.clear();
        
        f2(fpol);
        fpol >> y;
        fpol.clear();
        
        f2(fpol);
        fpol >> z;
        fpol.clear();
        fpol.get();
        if (fpol.peek() == EOF) flag = 1;
        
        f1(x, fver, fout);
        f1(y, fver, fout);
        f1(z, fver, fout, flag);
    }
    
    fpol.close();
    fver.close();
    fout.close();
 
    system("pause");
    return 0;
}
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
03.11.2012, 02:44 #11
Как по мне, кошернее будет ply.
нефиг делать лоадер без головняка запилить.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.11.2012, 02:55 #12
В дополнение.
На то и была создана индексация вершин, нормалей и координат текстур, чтобы уменьшить объемы потребляемой памяти и увеличить производительность.
То что ты хочешь сделать называется деградацией. А еще правильнее регрессом.

Добавлено через 1 минуту
У меня не было никакого умысла тебя обидеть (оскорбить). Я лишь сказал что я думаю по этому поводу.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.11.2012, 05:09 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
С небольшими дополнениями:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//в pol.txt       
 
// 1.1.4;
// 1.5.9;
// 2.2.9;
// 3.3.5;
// 4.4.5;
// 4.4.10;
// 6.6.10;
// 8.8.10;
 
// в ver.txt
 
// /* 3 */  glVertex3d(-2.092190,0.000000,0.697396);
// /* 2 */  glVertex3d(2.927495,0.000000,0.697396);
// /* 1 */  glVertex3d(-2.092190,0.000000,-2.282672);
// /* 8 */  glVertex3d(2.927495,0.000000,-2.282672);
// /* 5 */  glVertex3d(-2.092190,1.609770,0.697396);
// /* 6 */  glVertex3d(2.927495,1.609770,0.697396);
// /* 7 */  glVertex3d(-2.092190,1.609770,-2.282672);
// /* 4 */  glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 9 */  glVertex3d(1.774041,2.853168,1.245292);
 
// в out.txt будет
 
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 1 */ glVertex3d(-2.092190,0.000000,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 2 */ glVertex3d(2.927495,0.000000,0.697396);
// /* 9 */ glVertex3d(1.774041,2.853168,1.245292);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 3 */ glVertex3d(-2.092190,0.000000,0.697396);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 5 */ glVertex3d(-2.092190,1.609770,0.697396);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 4 */ glVertex3d(2.927495,1.609770,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 6 */ glVertex3d(2.927495,1.609770,0.697396);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 8 */ glVertex3d(2.927495,0.000000,-2.282672);
// /* 10 */ glVertex3d(1.774041,2.909065,1.812822);
 
#include <iostream>
#include <string>
#include <fstream>
#include <cctype>
#include <Windows.h>
using namespace std;
 
void f2(istream& fpol) // ищет цифру
{
    while (true)
    {
        if (isdigit(fpol.peek()) || fpol.peek() == EOF) break;
        fpol.seekg(1, ios::cur);
    }
}
 
void f3(istream& fpol) // ищет букву
{
    while (true)
    {
        if (isalpha(fpol.peek()) || fpol.peek() == EOF) break;
        fpol.seekg(1, ios::cur);
    }
}
 
void f1(int x, ifstream &fver, ofstream &fout, int flag = 0) // находит нужную запись и пишет её в файл
{
    int n;
    string str;
    
    while (true)
    {
        f2(fver); // ищем цифру
        
        fver >> n; // читаем номер точки
        
        if (n == x) // если найден нужный номер
        {
            f3(fver); // ищем букву
            
            fver >> str; // читаем запись функции
            
            fout << "/* " << n << " */ " << str; // записываем всё в файл
            if (flag == 0) fout << endl; // если не последняя строка в файле, то перевод строки
            fver.clear();
            fver.seekg(0);
            break;
        }
        else // если номер не тот
        {
            fver.ignore(255, '\n'); // пропускаем строку
            if (fver.eof())
            {
                fver.clear();
                fver.seekg(0);
                break;
            }
        }
    }
}
 
 
 
int main()
{
    ifstream fpol("pol.txt", ios::binary);
    ifstream fver("ver.txt", ios::binary);
    ofstream fout("fout.txt");
 
    int x, y, z;
    int flag = 0; // флаг последней строки в файле
    
    while (!fpol.eof())
    {
        if (fpol.peek() == EOF) break;
        f2(fpol); // ищем цифру
        fpol >> x; // читаем номер точки
        fpol.clear();
        
        f2(fpol); // ищем цифру
        fpol >> y; // читаем номер точки
        fpol.clear();
        
        f2(fpol); // ищем цифру
        fpol >> z; // читаем номер точки
        fpol.clear();
        fpol.get();
        if (fpol.peek() == EOF) flag = 1; // если строка последняя в файле, то устанавливаем флаг
        
        f1(x, fver, fout); // находим нужную запись для точки с номером x и пишем её в файл
        f1(y, fver, fout); // находим нужную запись для точки с номером y и пишем её в файл
        f1(z, fver, fout, flag); // находим нужную запись для точки с номером z и пишем её в файл
    }
    
    fpol.close();
    fver.close();
    fout.close();
 
    system("pause");
    return 0;
}
1
Anatoliy Coder
0 / 0 / 0
Регистрация: 04.10.2012
Сообщений: 75
03.11.2012, 15:24  [ТС] #14
1) Смысл: загрузить 3D модель в OpenGl
2) Спасибо мне уже помогли. Так что тема закрыта.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2012, 15:24
Привет! Вот еще темы с ответами:

Считывание файла - C++
Как можно считать из файла строку 110011, как массив чисел, заранее спасибо!

Считывание из файла - C++
Нужна помощь, уже не знаю, что делать. Проблема: Имеется функция для добавления хешированного логина и пароля в двоичный файл. ...

Считывание из файла в С++ - C++
Всем доброго времени суток. Есть задача: Дан текстовый файл в котором записаны данные следующим образом 1 12 3 2 3 11 5 2 11 ...

Считывание из файла - C++
Нужно считать из файла данные (по слову). Считывается только по символу. Помогите, пожалуйста, исправить. Может нужно перегрузить &gt;&gt; , если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
03.11.2012, 15:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru