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
Спокойный
Администратор
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
Спокойный
Администратор
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
Спокойный
Администратор
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
|
|
« Ответ #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
Спокойный
Администратор
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
Спокойный
Администратор
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 » |
|
да, спасибо... жаль, что такая фигня вообще возникает...
|
|
|
Записан
|
|
|
|
|