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

Парсинг файла игнорирует числа - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
11.03.2012, 18:31     Парсинг файла игнорирует числа #1
Всем добрый день. Пытаюсь прочитать данные из файла 3D модели в формате OBJ.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool L_ObjData::LoadFromFile(string FileName)
{
   ifstream ifs(FileName.c_str());
   if (!ifs)
   {
      return false;
   }
 
   bool check = true;
 
   while(check == true)
   {
      check = ProcessLine(ifs);
   }
   ifs.close();
   return true;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool L_ObjData::ProcessLine(istream& is)
{
   string element_id;
   float x, y, z;   
 
   is >> ws;
 
   if (!(is >> element_id))
   {
      return false;
   }
   // Дальше проверка строки
Дебажу element_id, он по одному слову из файла берет, но когда доходит до чисел - они просто игнорируются.

Вот мой тестовый файл
Код
# Blender v2.56 (sub 0) OBJ File: 'cube.blend'
# www.blender.org
mtllib cube.mtl
o Cube
v 0.984421 -0.936853 -1.021311
v 0.984421 -0.936853 0.978689
v -1.015579 -0.936853 0.978689
v -1.015578 -0.936853 -1.021311
v 0.984422 1.063147 -1.021311
v 0.984421 1.063147 0.978690
v -1.015579 1.063147 0.978689
v -1.015579 1.063147 -1.021311
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
usemtl Material_matrix.jpg
s off
f 1/1 2/2 3/3 4/4
f 5/1 8/2 7/3 6/4
f 1/1 5/2 6/3 2/4
f 2/1 6/2 7/3 3/4
f 3/1 7/2 8/3 4/4
f 5/1 1/2 4/3 8/4
После того как в element_id вижу в дебаге "o" и "Cube", потом только "v" и "vt", числа пропускаются. Подскажите пожалуйста как по целой строчке записывать в строку, чтобы ее потом нарезать на куски? Или как еще это можно сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2012, 18:31     Парсинг файла игнорирует числа
Посмотрите здесь:

C++ Парсинг строк из файла
Парсинг файла C++
C++ Парсинг файла
typdef struct + парсинг из файла C++
C++ Парсинг и валидация записи числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 18:46     Парсинг файла игнорирует числа #2
Что такое ws?
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
11.03.2012, 19:03  [ТС]     Парсинг файла игнорирует числа #3
Это отсюда
http://www.cplusplus.com/reference/i...perator%3E%3E/
с манипуляторами экспериментирую

Эта строчка на результате не сказалась.

C++
1
is >> ws;
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 19:19     Парсинг файла игнорирует числа #4
Покажите полностью код ProcessLine(istream& is).
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
11.03.2012, 19:29  [ТС]     Парсинг файла игнорирует числа #5
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
bool L_ObjData::ProcessLine(istream& is)
{
    string element_id;
    float x, y, z;   
 
    is >> ws;
 
    if (!(is >> element_id))
    {
        return false;
    }
 
    if (element_id == "v")
    {
        is >> x >> y >> z;
        AddPosition(float3(x, y, z));
    }
    else if (element_id == "vt")
    {
        is >> x >> y;
        AddUV(float2(x, 1.0f - y));
    }
    else if (element_id == "f")
    {   
        unsigned int vi[4] = {0, 0, 0, 0};
        unsigned int ti[4] = {0, 0, 0, 0};
 
        for (int i = 0; i < 4; i++)
        {
            char c;
            is >> vi[i] >> c >> ti[i];
            if(!is.good())
            {
                break;
            }
        }
 
        /*string tempstring;
        is >> tempstring;*/
 
        AddFace(S_ObjFace(vi[0], ti[0], vi[1], ti[1], vi[2], ti[2]));
        if(vi[3] != 0 && ti[3] != 0)
        {
            AddFace(S_ObjFace(vi[0], ti[0], vi[2], ti[2], vi[3], ti[3]));
        }
 
        is.clear();
    }
    else
    {
        SkipLine(is);
    }
 
    return true;
}
 
void L_ObjData::SkipLine(istream& is)
{
    char next;
    is >> std::noskipws;
    while( (is >> next) && (next != '\n') )
    {
 
    }
}
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 19:38     Парсинг файла игнорирует числа #6
Откуда вы сделали выводы, что числа пропускаются? Ваши операции. Какую переменную дебажили.
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
11.03.2012, 19:51  [ТС]     Парсинг файла игнорирует числа #7
Я работаю в Visual Studio 2010 Express.

Поставил брейкпоинты на 10 и 13ую строки кода и периодически нажимая F5 наводился мышью на element_id.

Результаты дебага (данные в element_id)
#
#
mtllib
o
v
"" - на этом срабатывает выход из функции по условию if (!(is >> element_id))

Результаты дебага если закомментить это
(50-52 строчки в коде в 5ом посте)
C++
1
2
3
4
else
{
  //SkipLine(is);
}
#
Blender
v2.56
(sub
0)
OBJ
File:
cube.blend
#
www.blender.org
mtllib
cube.mtl
o
Cube
v
v
v
v
v
v
v
vt
vt
...

В обоих случаях фрагменты с числами были проигнорированы.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
11.03.2012, 20:02     Парсинг файла игнорирует числа #8
Цитата Сообщение от Tilk Посмотреть сообщение
Поставил брейкпоинты на 10 и 13ую строки кода и периодически нажимая F5
пошаговое прохождение Ф10 без захода в функции Ф11 с заходом
Цитата Сообщение от Tilk Посмотреть сообщение
наводился мышью на element_id.
лучше записать в окно переменных

Добавлено через 6 минут
Цитата Сообщение от Tilk Посмотреть сообщение
element_id == "v"
ты считал строку а проверяешь её на символ(точнее строку из одной буквы) конечно они не равны
тебе надо функции поиска (находятся ли в строке символ v)
разделения
если да то все что справа прочитать числами
Цитата Сообщение от Tilk Посмотреть сообщение
float x, y, z;
Цитата Сообщение от Tilk Посмотреть сообщение
is >> x >> y >> z;
с чего ты взял что в текстовом файле есть числа?
это такие же строки которые надо конвертировать
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 20:05     Парсинг файла игнорирует числа #9
Tilk, вы проверяете переменную element_id, но в ней чисел быть и не может.
Числа обрабатываются здесь:
C++
1
is >> x >> y >> z;
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
11.03.2012, 20:11  [ТС]     Парсинг файла игнорирует числа #10
gooseim
Господи, точно! Спасибо огромное!
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
13.03.2012, 18:24  [ТС]     Парсинг файла игнорирует числа #11
Помогите пожалуйста найти ошибку. Парсинг этого же файла.

Фрагмент
Код
	case OBJ_STRING_VERTEXPOS:
		fin >> x >> y >> z;
		AddPosition(x, y, z);
		SkipLine(fin);
		break;
В x,y,z не записываются нормальные данные. (см. прилепленный файл)

Строчка в файле данных
Код
v 0.984421 -0.936853 0.978689
Весь код
Код
////////////////////////////////////////////////////////////////////////////////
// Filename: L_objdata.cpp
////////////////////////////////////////////////////////////////////////////////
#include "L_objdata.h"

L_ObjData::L_ObjData()
{

}

L_ObjData::~L_ObjData()
{

}

bool L_ObjData::LoadFromFile(string FileName)
{
	ifstream fin;
	fin.open(FileName);
	fin >> noskipws;

	if(!fin)
	{
		return false;
	}

	while(!fin.eof())
	{
		ProcessLine(fin);
	}

	return true;
}

OBJ_STRING L_ObjData::CheckLineType(string teststring)
{
	if(teststring == "#")
	{
		return OBJ_STRING_COMMENT;
	}
	if(teststring == "v")
	{
		return  OBJ_STRING_VERTEXPOS;
	}
	if(teststring == "vt")
	{
		return  OBJ_STRING_TEXCOORD;
	}
	if(teststring == "f")
	{
		return  OBJ_STRING_FACE;
	}

	return  OBJ_STRING_UNKNOWN;
}

bool L_ObjData::ProcessLine(ifstream& fin)
{
	string element_id;
	if(!(fin >> element_id))
	{
		return false;
	}

	float x, y, z;

	switch(CheckLineType(element_id))
	{
	case OBJ_STRING_COMMENT:
		SkipLine(fin);
		break;
	case OBJ_STRING_VERTEXPOS:
		fin >> x >> y >> z;
		AddPosition(x, y, z);
		SkipLine(fin);
		break;
	case OBJ_STRING_TEXCOORD:
		SkipLine(fin);
		break;
	case OBJ_STRING_FACE:
		SkipLine(fin);
		break;
	case OBJ_STRING_UNKNOWN:
		SkipLine(fin);
		break;
	};

	return true;
}

void L_ObjData::SkipLine(ifstream& fin)
{
    char next = ' ';
    while(next != '\n')
	{
		fin >> next;
	};
}

void L_ObjData::AddPosition(float tx, float ty, float tz)
{
	positions.push_back(float3(tx,ty,tz));
}
Миниатюры
Парсинг файла игнорирует числа  
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
13.03.2012, 20:06     Парсинг файла игнорирует числа #12
Цитата Сообщение от Tilk Посмотреть сообщение
fin >> noskipws;
Это зачем?
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
13.03.2012, 20:14  [ТС]     Парсинг файла игнорирует числа #13
Без этого вообще ничего не читается. Один раз ловится "#" в element_id и больше ничего.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
13.03.2012, 20:20     Парсинг файла игнорирует числа #14
А с ним разве лучше?
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
13.03.2012, 20:23  [ТС]     Парсинг файла игнорирует числа #15
Да. С ним, если закомментить строчки 73 и 74 и поставить брейкоинты на все SkipLine(fin). То програма определяет все "#", "v", "vt", "f" в том порядке как они идут в файле. Не понятно только, почему после "v" не читаются три числа.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
13.03.2012, 20:29     Парсинг файла игнорирует числа #16
файл в правильной кодировке? line endings какие? виндовые?
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
13.03.2012, 20:31  [ТС]     Парсинг файла игнорирует числа #17
Не уверен, вот файл
Вложения
Тип файла: zip cube.zip (365 байт, 6 просмотров)
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
13.03.2012, 20:32     Парсинг файла игнорирует числа #18
ну проверь сам как-нибудь
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
13.03.2012, 20:38  [ТС]     Парсинг файла игнорирует числа #19
Ну... метод SkipLine перебрасывает на следующую строчку по условию while(next != '\n'). Значит символ '/n' распознается. Выходит с эндингами и кодировкой все хорошо?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2012, 20:48     Парсинг файла игнорирует числа
Еще ссылки по теме:

Парсинг из файла и суммирование столбца C++
C++ Парсинг файла .cnf
C++ Парсинг файлов, найти целые числа

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

Или воспользуйтесь поиском по форуму:
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
13.03.2012, 20:48     Парсинг файла игнорирует числа #20
тебе виднее, я не знаю откуда у тебя этот файл
Yandex
Объявления
13.03.2012, 20:48     Парсинг файла игнорирует числа
Ответ Создать тему
Опции темы

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