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

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

Войти
Регистрация
Восстановить пароль
 
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
#1

Не работает sscanf - C++

19.04.2014, 14:17. Просмотров 483. Ответов 9
Метки нет (Все метки)

Пишу загрузчик моделей формата obj. Но очень странно себя ведет функция sscanf_s. Вот снимок экрана, где ясно видно, что sscanf_s выдает не то, что от неё хотят:

https://dl.dropboxusercontent.com/u/83673710/sscanf_s.png

Приведу полный код класса:

OBJ.HPP:
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
#include <vector>
#include <ctime>
#include <cstdio>
//#include <GL\glew.h>
 
#ifndef OBJ_HPP
#define OBJ_HPP
 
class OBJ_Static
{
private:
    struct vec2
    {
        float x, y;
    };
 
    struct vec3
    {
        float x, y, z;
    };
 
    struct face
    {
        vec3 v, vn;
        vec2 vt;
    };
 
    std::vector<vec3> v, vn;
    std::vector<vec2> vt;
    unsigned self_num;
    //GLuint self_vbo;
    float loadTime;
    bool textured;
    char *path;
    vec3 pos;
 
    static unsigned amount;
 
public:
    bool loaded;
    std::vector<face> faces;
 
    OBJ_Static();
    OBJ_Static(char *_path, bool _loadnow);
    ~OBJ_Static();
 
    void MoveTo(float x, float y, float z);
    void GetPos(float x, float y, float z);
    float GetLoadTime();
    bool Load();
    void Draw();
};
 
#endif
OBJ.CPP:
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
#include "OBJ.hpp"
 
unsigned OBJ_Static::amount = 0;
 
OBJ_Static::OBJ_Static()
{
    loaded = false;
 
    pos.x = 0;
    pos.y = 0;
    pos.z = 0;
 
    self_num = ++amount;
 
    //glGenBuffers(self_num, &self_vbo);
}
 
OBJ_Static::OBJ_Static(char *_path, bool _loadnow)
{
    OBJ_Static();
    path = _path;
    if (_loadnow)
        loaded = Load();
    else
        loaded = false;
}
 
OBJ_Static::~OBJ_Static()
{
}
 
bool OBJ_Static::Load()
{
    clock_t cl = clock();
 
    //переменные
    FILE *file;
    char str[256];
    //переменные
    
    fopen_s(&file, path, "r");
 
    while (!feof(file))
    {
        if (fgets(str, sizeof(str), file) == NULL) break;
 
        // Проверяем строку на длину. Если она меньше 7-ми
        // символов, то пропускаем итеррацию
        for (int i = 0; i < sizeof(str); i++)
            if (str[i] == '\n')
                if (i < 7)
                    continue;
 
        if (str[0] == 'v')
        {
            if (str[1] == ' ')
            {
                vec3 vec;
                sscanf_s(&str[2], "%f%f%f", &vec.x, &vec.y, &vec.z);
                v.push_back(vec);
            }
            else
            if (str[1] == 't')
            {
                vec2 vec;
                sscanf_s(str, "vt %f%f\n", &vec.x, &vec.y);
                vt.push_back(vec);
            }
            else
            if (str[1] == 'n')
            {
                vec3 vec;
                sscanf_s(str, "vn %f%f%f\n", &vec.x, &vec.y, &vec.z);
                vn.push_back(vec);
            }
        }
        else
        if (str[0] == 'f')
        {
            unsigned f[9];
            sscanf_s(str, "f %d/%d/%d%d/%d/%d%d/%d/%d\n",
                &f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&f[6],&f[7],&f[8]);
 
            face fc;
            for (int i = 0; i < 9; i += 3)
            {
                fc.v = v[f[i] - 1];
                fc.vt = vt[f[i + 1] - 1];
                fc.vn = vn[f[i + 2] - 1];
 
                faces.push_back(fc);
            }
        }
    }
 
    fclose(file);
    loadTime = (float)(clock() - cl) / CLK_TCK;
    return true;
}
 
float OBJ_Static::GetLoadTime()
{
    return loadTime;
}
 
void OBJ_Static::Draw()
{
    if (!loaded) return;
 
    //glEnableClientState(GL_VERTEX_ARRAY);
    //glDrawArrays(GL_TRIANGLES, 0,
    //  v.size() * sizeof(vec3) / sizeof(float) / 3);
}
В чем может быть ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2014, 14:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает sscanf (C++):

Sscanf - C++
Как заставить sscanf парсить строку %s(%d) отдельно, а не все сразу как %s?

sscanf заборохлил - C++
имеется 2 программы. в одной является валидной запись line = &quot;v 1,000000 -1,000000 1,000000&quot;; line = ' '; ...

Ошибка в sscanf - C++
Доброго времени суток. Возникла ошибка в следующем коде: #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;ctype.h&gt; ...

Работа sscanf - C++
Мне нужно распарсить файл с такими строками: Element1\tElement2\tElement3\tElement4\tElement5\n ...

Sscanf не реагирует на ввод - C++
проблема такая: printf(&quot;vvod: &quot;); fflush(stdin); sscanf(&quot;%s&quot;,s); что с fflush, что без вообще ничего не воспринимает, то...

Неверная работа sscanf - C++
void mul(long long a, int y, int p, char *input) { memset(a, 0, sizeof(int)*11112); char temp; int i = strlen(input), j = 0, k; ...

9
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 14:41 #2
Цитата Сообщение от Qadabr Посмотреть сообщение
В чем может быть ошибка?
Стандартными функциями пользуйтесь, и будет вам счастье...
0
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 14:53  [ТС] #3
Не понял. Какие функции у меня тут не стандартные? Если Вы про sscanf_s, то sscanf выдает тоже самое.
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,674
19.04.2014, 14:55 #4
Там же не видно, где выполнение остановилось. Может эта точка останова вообще не отработала.
0
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 15:06  [ТС] #5
Вообще, без точек останова программа выполняется без выбросов исключений. Есть интересный момент:

https://dl.dropboxusercontent.com/u/83673710/main.png

т.е. все время на этом участке кода в vec записываются одни и те же значения. О чем это может говорить? Я уже отчаялся в поиске ошибки
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,674
19.04.2014, 15:51 #6
Что в этом файле obj?

Добавлено через 10 минут
Вот этот фрагмент мне не понятен, он ни на что не влияет, выполнения пойдёт всё равно дальше:
C++
1
2
3
4
5
6
// Проверяем строку на длину. Если она меньше 7-ми
        // символов, то пропускаем итеррацию
        for (int i = 0; i < sizeof(str); i++)
            if (str[i] == '\n')
                if (i < 7)
                    continue;
continue у тебя для while?

Добавлено через 5 минут
Почему не так:
C++
1
if(strlen(str) < 7) continue;
1
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 15:55  [ТС] #7
https://dl.dropboxusercontent.com/u/83673710/test.obj

Да, в этом участке ступил. Её вообще можно убрать, эффект не изменится)

Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Почему не так:
C++
1
if(strlen(str) < 7) continue;
Да, да) признаю тупняк) бывает у меня.
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,674
19.04.2014, 15:56 #8
Теперь работает?
0
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 16:37  [ТС] #9
Нет. не работает) В дебаге же видно, что строка все равно корректная, а чтение с этой строки не корректное

Добавлено через 39 минут
Всем спасибо. Решение найдено. Ошибка заключалась в злополучной setlocale(0,"RUS");
0
nmcf
5538 / 4848 / 1644
Регистрация: 14.04.2014
Сообщений: 19,674
19.04.2014, 17:11 #10
По смыслу программы в faces следует хранить не копии того, что в v, vt, а индексы в соотвествующих vector.
1
19.04.2014, 17:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2014, 17:11
Привет! Вот еще темы с ответами:

Работа функции sscanf - C++
Есть у меня функция, написанная ниже. Она работает, но возникает вопрос: как функция sscanf умудряется записать в интовую переменную всю...

Существуют ли аналоги функции sscanf на c++? - C++
Доброго времени суток, при использовании sscanf столкнулся с проблемой: стандартная библиотека слишком велика. Может быть кто-то...

Как заставить sscanf работать с динамическими массивами? - C++
Как заставить sscanf работать с динамическими массивами или есть этому альтернатива(кроме strtok)?

Код с использованием функции Sscanf - Что сделано неправильно? - C++
Доброго времени суток. Что сделано неправильно? #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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