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

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

Восстановить пароль Регистрация
 
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 14:17     Не работает sscanf #1
Пишу загрузчик моделей формата obj. Но очень странно себя ведет функция sscanf_s. Вот снимок экрана, где ясно видно, что sscanf_s выдает не то, что от неё хотят:

https://dl.dropboxusercontent.com/u/...0/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);
}
В чем может быть ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2014, 14:17     Не работает sscanf
Посмотрите здесь:

C++ Непонятное поведение sscanf(.., "%lf", ..)
Работа sscanf C++
sscanf заборохлил C++
C++ Как заставить sscanf работать с динамическими массивами?
C++ Неверная работа sscanf
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.04.2014, 14:41     Не работает sscanf #2
Цитата Сообщение от Qadabr Посмотреть сообщение
В чем может быть ошибка?
Стандартными функциями пользуйтесь, и будет вам счастье...
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 14:53  [ТС]     Не работает sscanf #3
Не понял. Какие функции у меня тут не стандартные? Если Вы про sscanf_s, то sscanf выдает тоже самое.
nmcf
4306 / 3727 / 1256
Регистрация: 14.04.2014
Сообщений: 14,599
19.04.2014, 14:55     Не работает sscanf #4
Там же не видно, где выполнение остановилось. Может эта точка останова вообще не отработала.
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 15:06  [ТС]     Не работает sscanf #5
Вообще, без точек останова программа выполняется без выбросов исключений. Есть интересный момент:

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

т.е. все время на этом участке кода в vec записываются одни и те же значения. О чем это может говорить? Я уже отчаялся в поиске ошибки
nmcf
4306 / 3727 / 1256
Регистрация: 14.04.2014
Сообщений: 14,599
19.04.2014, 15:51     Не работает sscanf #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;
Qadabr
2 / 2 / 1
Регистрация: 12.05.2013
Сообщений: 32
19.04.2014, 15:55  [ТС]     Не работает sscanf #7
https://dl.dropboxusercontent.com/u/83673710/test.obj

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

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

Добавлено через 39 минут
Всем спасибо. Решение найдено. Ошибка заключалась в злополучной setlocale(0,"RUS");
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2014, 17:11     Не работает sscanf
Еще ссылки по теме:

Работа функции sscanf C++
C++ Sscanf не реагирует на ввод
C++ Существуют ли аналоги функции sscanf на c++?

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

Или воспользуйтесь поиском по форуму:
nmcf
4306 / 3727 / 1256
Регистрация: 14.04.2014
Сообщений: 14,599
19.04.2014, 17:11     Не работает sscanf #10
По смыслу программы в faces следует хранить не копии того, что в v, vt, а индексы в соотвествующих vector.
Yandex
Объявления
19.04.2014, 17:11     Не работает sscanf
Ответ Создать тему
Опции темы

Текущее время: 02:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru