Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: fscanf и чтение флотов  (Прочитано 8669 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mitia
Гость
« : 17-09-2005 08:28 » 

Дочитываю до строки:  6 1.0 2.57905 0.210987 3.28752 0.0795794 0.177081 0.980974
Читать пытаюсь так: fscanf(file,"%d %f %f %f %f %f %f %f", &tt);

Тут и вываливается. Из-за чего это может быть?

Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 17-09-2005 08:40 » 

Mitia, Расшифруй пожалуйста, что есть tt и если можно, то кусок проги, от открытия файла и до закрытия.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mitia
Гость
« Ответ #2 : 17-09-2005 09:00 » 

Вот код весь...

Код:
struct Bones
{
char name[64];
int num;
};

Bones *bones;

struct Vertex
{
char name[64];
float tex_u, tex_v;

};

Vertex *v;

struct Weights
{
int bone[3];
float weight[3];
float x[3],y[3],z[3];
float nx[3],ny[3],nz[3];
};

Weights *w;


#include <stdio.h>
#include <string.h>

#include <iostream>
using namespace std;

void read_string(FILE *file,char *string) {
char c;
char *s = string;
int quoted = -1;
while(fread(&c,sizeof(char),1,file) == 1) {
if(quoted == -1) {
if(c == '"') quoted = 1;
else if(!strchr(" \t\n\r",c)) {
*s++ = c;
quoted = 0;
}
continue;
}
if(quoted == 1 && c == '"') break;
if(quoted == 0 && strchr(" \t\n\r",c)) break;
*s++ = c;
}
*s = '\0';
}

main()
{

FILE *file = fopen("c:\\sm.mesh", "r");

       char buffer[1024];
fscanf(file, "%s",  buffer);
//compare, we must get "bones" and if so than read data to the structure units
if(strcmp(buffer,"bones")==0)
{
//read number and a brace
// use %d %s, %s will be stopped after a brace because of /n symbol
int num_bones = 0;
fscanf(file,"%d %s", &num_bones, buffer);

//выделяем память под Н структур
bones = new Bones[num_bones];

//cycle for reading all names
for (int i = 0; i<num_bones;i++)
{
read_string(file, bones[i].name);
cout<< bones[i].name<<"\n";
}

//read brace
fscanf(file,"%s", buffer);

//surface
fscanf(file,"%s", buffer);
cout<<buffer<<"\n";

//read name of surface
fscanf(file,"%s", buffer);

//read brace
fscanf(file,"%s", buffer);

//read vertex num and brace
int num_vertex = 0;
char b[90];
fscanf(file,"%s %d %s", buffer, &num_vertex,b);

v = new Vertex[num_vertex];
w = new Weights[num_vertex];

//int *tx[num_vertex], *ty[num_vertex];

        for (int i = 0; i<num_vertex;i++)
{
cout<<"  i  =  "<<i<<"\n";
//tex coords
fscanf(file,"%f %f", &v[i].tex_u, &v[i].tex_v);
cout<<v[i].tex_u<<" "<<v[i].tex_v<<" \n";

//weights 1 {
int num_weights = 0;
int tt;
char temp_buf[20];
fscanf(file,"%s %d %s", buffer, &num_weights, temp_buf);
cout<<buffer<<" "<<num_weights<<" "<<temp_buf<<" \n";
for (int b =0; b<num_weights;b++)
{// array for weights and vertexes - double array
fscanf(file,"%d %f %f %f %f %f %f %f", &tt);
cout<<"!!!!!!"<<tt<<" !!!!!\n";
}
//brace
fscanf(file,"%s", buffer);
}

}

return 0;
}


от кусок читаемого файла:

Код:
bones 4 {
"Bip01 Pelvis"
"Bip01 Spine"
"Bip01 R Finger41"
"Bip01 R Finger42"
}
surface u_head {
vertex 174 {
0.934403 0.826975
weight 1 {
6 1.0 5.98643 2.74235 -2.78334 -0.968131 0.250443 1.09847e-006
}
0.960665 0.888616
weight 2 {
6 1.0 6.34843 4.14172 -1.54797 -0.968131 0.250444 2.6604e-006
                        6 1.0 6.34843 4.14172 -1.54797 -0.968131 0.250444 2.6604e-006
}

и т.д.


Единственное, что тут попадается e-006, но до него даже не дочитывает - вываливается на третьем числе.
« Последнее редактирование: 20-12-2007 18:48 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 17-09-2005 09:13 » 

Посмотри как ты читаеш до этого
Код:
fscanf(file,"%s %d %s", buffer, &num_weights, temp_buf);
и в своей строке
Код:
fscanf(file,"%d %f %f %f %f %f %f %f", &tt);
По идее у тебя только должна читаться одна цифра, так как ты определил только tt. А компилятору в строке "%d %f %f %f %f %f %f %f" ты говориш читай 8 цифр.
« Последнее редактирование: 17-09-2005 10:07 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mitia
Гость
« Ответ #4 : 17-09-2005 09:29 » 

хм, вроде как при отсутствии значений, куда вносить данные, они просто никуда не заносятся, но если сдалеть так, то все равно вываливается:

float yy;
fscanf(file,"%d %f %f %f %f %f %f %f", &tt, &yy);
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 17-09-2005 09:47 » 

А так не пробовал
fscanf(file,"%d %f %f %f %f %f %f %f", &tt, &yy, &yy, &yy, &yy, &yy, &yy, &yy);
На такой строке  меня не обругали
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mitia
Гость
« Ответ #6 : 17-09-2005 09:55 » 

гм, да, действительно...
миф про то, что данные идут в никуда рассеялся... будем-с теперь знать.

Спасибо.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 17-09-2005 21:59 » 

Ф-ии серии scanf() ничего не знают об наличии и числе переменных аргументов. Они могут только опираться на задаваемый тобой формат. Указал, что хочешь поместить данные в 8 переменных float - будь добер указать их. Указатель на массив из 8 float не поможет - надо 8 указателей на float.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mitia
Гость
« Ответ #8 : 18-09-2005 08:28 » 

Вот сделал, как надо, но опять где-то что--то не так. вроде читает, если судить по дебаггеру, но вываливается...

Код:
struct Weights
{
int bone;
float weight;
float x,y,z;
float nx,ny,nz;
};

struct Vertex
{
char name[64];
float tex_u, tex_v;
Weights *w;
};

Vertex *v;

................................

v->w = new Weights[num_weights];
for (int b =0; b<num_weights;b++)
{
fscanf(file,"%d %f %f %f %f %f %f %f",
&v->w[b].bone, &v->w[b].weight, &v->w[b].x, &v->w[b].y, &v->w[b].z, v->w[b].nx, &v->w[b].ny, &v->w[b].nz);
}
Записан
Mitia
Гость
« Ответ #9 : 19-09-2005 17:39 » 

переделал... все равно вылетает Жаль(


Код:
for( i = 0 ; i < num_vertex ; i ++ )
 {
  v[i].w = new Weights[num_weights];
 }
for (int b =0; b<num_weights;b++)
fscanf(file,"%d %f %f %f %f %f %f %f",  &v[i].w[b].bone, &v[i].w[b].weight, &v[i].w[b].x, &v[i].w[b].y, &v[i].w[b].z, v[i].w[b].nx, &v[i].w[b].ny, &v[i].w[b].nz);
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 19-09-2005 17:51 » 

Еше раз дай полный код. У меня предположение, что не правильное обрашение к переменным. Надо смотреть.

Цитата

   &v.w.bone, &v.w.weight, &v.w.x, &v.w.y, &v.w.z, v.w.nx, &v.w.ny, &v.w.nz


И кстати
Код:
for( i = 0 ; i < num_vertex ; i ++ )
{
  v[i].w = new Weights[num_weights];
}
У тебя тут цикл закрылся. Цикл по b идет самостоятельно. Так как i=num_vertex Ты выходиш за пределы массива. Во время исполнения это будет только портить данные, которые будут идти за переменной v.
« Последнее редактирование: 19-09-2005 18:11 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mitia
Гость
« Ответ #11 : 19-09-2005 18:06 » 

амперсанд поставил - ничего не дало...

вот код:

Код:
struct Bones
{
char name[64];
int num;
};

Bones *bones;

struct Weights
{
int bone;
float weight;
float x,y,z;
float nx,ny,nz;
};

struct Vertex
{
char name[64];
float tex_u, tex_v;
Weights *w;
};

Vertex *v;

#include <stdio.h>
#include <string.h>

#include <iostream>
using namespace std;

void read_string(FILE *file,char *string) {
char c;
char *s = string;
int quoted = -1;
while(fread(&c,sizeof(char),1,file) == 1) {
if(quoted == -1) {
if(c == '"') quoted = 1;
else if(!strchr(" \t\n\r",c)) {
*s++ = c;
quoted = 0;
}
continue;
}
if(quoted == 1 && c == '"') break;
if(quoted == 0 && strchr(" \t\n\r",c)) break;
*s++ = c;
}
*s = '\0';
}

main()
{

FILE *file = fopen("c:\\sm.mesh", "r");

char buffer[1024];
fscanf(file, "%s",  buffer);
//compare, we must get "bones" and if so than read data to the structure units
if(strcmp(buffer,"bones")==0)
{
int num_bones = 0;
fscanf(file,"%d %s", &num_bones, buffer);

//выделяем память под Н структур
bones = new Bones[num_bones];

//cycle for reading all names
for (int i = 0; i<num_bones;i++)
{
read_string(file, bones[i].name);
cout<< bones[i].name<<"\n";
}

//read brace
fscanf(file,"%s", buffer);
cout<<buffer<<"\n";


fscanf(file,"%s", buffer);

//read name of surface
fscanf(file,"%s", buffer);

//read brace
fscanf(file,"%s", buffer);

//read vertex num and brace
int num_vertex = 0;
char b[90];
fscanf(file,"%s %d %s", buffer, &num_vertex,b);
cout<<buffer<<" "<<num_vertex<<" \n";

v = new Vertex[num_vertex];

float yy;
        for (int i = 0; i<num_vertex;i++)
{
//tex coords
fscanf(file,"%f %f", &v[i].tex_u, &v[i].tex_v);

//weights 1 {
int num_weights = 0;
int tt;
char temp_buf[20];
fscanf(file,"%s %d %s", buffer, &num_weights, temp_buf);

for( i = 0 ; i < num_vertex ; i ++ )
 {
  v[i].w = new Weights[num_weights];
 }
for (int b =0; b<num_weights;b++)
fscanf(file,"%d %f %f %f %f %f %f %f",  &v[i].w[b].bone, &v[i].w[b].weight, &v[i].w[b].x, &v[i].w[b].y, &v[i].w[b].z, &v[i].w[b].nx, &v[i].w[b].ny, &v[i].w[b].nz);

//brace
fscanf(file,"%s", buffer);
}

}

return 0;
}
« Последнее редактирование: 20-12-2007 18:53 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 19-09-2005 18:17 » 

Посмотри что я дополнил постом выше. У тебя логическая ошибка программы влекушая в худшем случае вылетом программы. И тем более внутрений цикл использует переменную внешнего цикла.

Код:
        for (int i = 0; i<num_vertex;i++)                                   //Головной цикл Используется переменная i
{
//tex coords
fscanf(file,"%f %f", &v[i].tex_u, &v[i].tex_v);

//weights 1 {
int num_weights = 0;
int tt;
char temp_buf[20];
fscanf(file,"%s %d %s", buffer, &num_weights, temp_buf);

for( i = 0 ; i < num_vertex ; i ++ )                           //Вложенный цикл. Также используется переменная i
{                                                                        //После выхода из цикла i=num_vertex
  v[i].w = new Weights[num_weights];
}
for (int b =0; b<num_weights;b++)
fscanf(file,"%d %f %f %f %f %f %f %f",  &v[i].w[b].bone, &v[i].w[b].weight, &v[i].w[b].x, &v[i].w[b].y, &v[i].w[b].z, &v[i].w[b].nx, &v[i].w[b].ny, &v[i].w[b].nz);

//brace
fscanf(file,"%s", buffer);
}

}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mitia
Гость
« Ответ #13 : 19-09-2005 18:32 » 

да, спасибо...

жаль, что такая фигня вообще возникает... Жаль
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines