Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
July 03, 2006 sscanf problem, | ||||
---|---|---|---|---|
| ||||
Hi I have a little strange problem, probably I am doing something wrong. I am writing a small parser for an 3d .OBJ format. I am using sscanf for parsing. Most of the results are correct, except one place. Here is the part of input text file: g object_1 f 12/934/12 228/1/228 231/936/231 f 228/1/228 72/75/72 229/935/229 f 231/936/231 229/935/229 75/937/75 f 227/2/227 231/936/231 230/10/230 f 72/75/72 695/960/695 1346/3/1346 f 695/960/695 2/1352/2 1345/1328/1345 f 1346/3/1346 1345/1328/1345 73/938/73 f 229/935/229 1346/3/1346 233/939/233 f 654/7/654 232/6/232 75/937/75 f 233/939/233 236/4/236 654/7/654 f 75/937/75 233/939/233 654/7/654 f 644/5/644 236/4/236 233/939/233 f 73/938/73 234/1340/234 644/5/644 f 233/939/233 73/938/73 644/5/644 f 236/4/236 644/5/644 647/940/647 f 644/5/644 234/1340/234 645/859/645 f 647/940/647 645/859/645 646/234/646 f 643/8/643 647/940/647 235/1032/235 f 232/6/232 654/7/654 656/941/656 f 654/7/654 236/4/236 643/8/643 f 656/941/656 643/8/643 655/231/655 f 653/942/653 656/941/656 655/231/655 f 666/15/666 242/943/242 71/9/71 f 230/10/230 244/16/244 666/15/666 f 71/9/71 230/10/230 666/15/666 f 658/12/658 244/16/244 230/10/230 f 75/937/75 232/6/232 658/12/658 f 230/10/230 75/937/75 658/12/658 f 244/16/244 658/12/658 660/11/660 -------------------------- Here is the code I use for reading that : // 1 Vertex -- 2 Vertex -- 3 Vertex text.sscanf("f %d/%d/%d %d/%d/%d %d/%d/%d", &triangles[ arpos ].vertexes[0].vid[0] , &triangles[ arpos ].vertexes[0].vid[1] , &triangles[ arpos ].vertexes[0].vid[2] , &triangles[ arpos ].vertexes[1].vid[0] , &triangles[ arpos ].vertexes[1].vid[1] , &triangles[ arpos ].vertexes[1].vid[2] , &triangles[ arpos ].vertexes[2].vid[0] , &triangles[ arpos ].vertexes[2].vid[1] , &triangles[ arpos ].vertexes[2].vid[2] ); ---- text is char[] results are just int. Anyway all the code is parsed pretty well, except for a few places: 12/934/12 228/1/228 231/936/231 228/1/228 72/75/72 229/935/2298 <---- 2298, should be 229 ! 231/936/231 229/935/229 75/937/75 227/2/227 231/936/231 230/10/230 72/75/72 695/960/695 1346/3/1346 695/960/695 2/1352/2 1345/1328/1345 1346/3/1346 1345/1328/1345 73/938/73 229/935/229 1346/3/1346 233/939/233 654/7/654 232/6/232 75/937/75 233/939/233 236/4/236 654/7/654 75/937/75 233/939/233 654/7/654 644/5/644 236/4/236 233/939/233 73/938/73 234/1340/234 644/5/644 233/939/233 73/938/73 644/5/644 236/4/236 644/5/644 647/940/647 644/5/644 234/1340/234 645/859/645 647/940/647 645/859/645 646/234/646 643/8/643 647/940/647 235/1032/235 232/6/232 654/7/654 656/941/656 654/7/654 236/4/236 643/8/643 656/941/656 643/8/643 655/231/655 653/942/653 656/941/656 655/231/655 666/15/666 242/943/242 71/9/71 230/10/230 244/16/244 666/15/666 71/9/71 230/10/230 666/15/666 658/12/658 244/16/244 230/10/230 75/937/75 232/6/232 658/12/6583 <---- 6583, should be 658 ! 230/10/230 75/937/75 658/12/658 244/16/244 658/12/658 660/11/660 So any ideas, what might be bugging here :) ? |
July 03, 2006 Re: sscanf problem, | ||||
---|---|---|---|---|
| ||||
Posted in reply to DMINATOR | "DMINATOR" <DMINATOR_member@pathlink.com> wrote in message news:e8c4qc$2pji$1@digitaldaemon.com... > Anyway all the code is parsed pretty well, except for a few places: > > 228/1/228 72/75/72 229/935/2298 <---- 2298, should be 229 ! 75/937/75 232/6/232 658/12/6583 <---- 6583, should be 658 ! > > So any ideas, what might be bugging here :) ? Hmm. I tried duplicating the problem, but it seemed to work just fine. The only thing I can think of is that since sscanf is a C function, it expects strings to be null-terminated, and perhaps your string data might not be. So try something like sscanf(toStringz(text), "format string", &all, &the, &outputs); See if that helps it. |
July 05, 2006 Re: sscanf problem, | ||||
---|---|---|---|---|
| ||||
Posted in reply to DMINATOR | DMINATOR wrote:
> Hi
>
> I have a little strange problem, probably I am doing something wrong.
>
> I am writing a small parser for an 3d .OBJ format. I am using sscanf for
> parsing. Most of the results are correct, except one place.
>
> Here is the part of input text file:
>
> g object_1
> f 12/934/12 228/1/228 231/936/231
> f 228/1/228 72/75/72 229/935/229
> f 231/936/231 229/935/229 75/937/75
> f 227/2/227 231/936/231 230/10/230
> f 72/75/72 695/960/695 1346/3/1346
> f 695/960/695 2/1352/2 1345/1328/1345
> f 1346/3/1346 1345/1328/1345 73/938/73
> f 229/935/229 1346/3/1346 233/939/233
> f 654/7/654 232/6/232 75/937/75
> f 233/939/233 236/4/236 654/7/654
> f 75/937/75 233/939/233 654/7/654
> f 644/5/644 236/4/236 233/939/233
> f 73/938/73 234/1340/234 644/5/644
> f 233/939/233 73/938/73 644/5/644
> f 236/4/236 644/5/644 647/940/647
> f 644/5/644 234/1340/234 645/859/645
> f 647/940/647 645/859/645 646/234/646
> f 643/8/643 647/940/647 235/1032/235
> f 232/6/232 654/7/654 656/941/656
> f 654/7/654 236/4/236 643/8/643
> f 656/941/656 643/8/643 655/231/655
> f 653/942/653 656/941/656 655/231/655
> f 666/15/666 242/943/242 71/9/71
> f 230/10/230 244/16/244 666/15/666
> f 71/9/71 230/10/230 666/15/666
> f 658/12/658 244/16/244 230/10/230
> f 75/937/75 232/6/232 658/12/658
> f 230/10/230 75/937/75 658/12/658
> f 244/16/244 658/12/658 660/11/660
>
>
> --------------------------
> Here is the code I use for reading that :
>
Here is my function for reading OBJ faces:
alias char[] string;
void read_face( string data, Group target )
{
if ( target is null ) throw new Exception("Face data with no group found!" );
string[] info = split( data );
if ( info.length != 3 ) throw new Exception("Malformed face data:" ~ data );
face* f = target.addface();
void add( int which, string vi, string ci )
{
f.v[which] = atoi(vi)-1;
f.c[which] = atoi(ci)-1;
}
void add_info( int index )
{
string s = info[index];
string[] arr = split( s, "/" );
if ( arr.length<2 ) throw new Exception("Malformed face data group:"~ s );
else add( index, arr[0], arr[1] );
}
add_info( 0 );
add_info( 1 );
add_info( 2 );
}
-DavidM
|
July 06, 2006 Re: sscanf problem, | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Medlock | On Wed, 05 Jul 2006 14:22:02 +0300, David Medlock <noone@nowhere.com> wrote: > DMINATOR wrote: >> Hi >> I have a little strange problem, probably I am doing something wrong. >> I am writing a small parser for an 3d .OBJ format. I am using sscanf for >> parsing. Most of the results are correct, except one place. >> Here is the part of input text file: >> g object_1 >> f 12/934/12 228/1/228 231/936/231 >> f 228/1/228 72/75/72 229/935/229 >> f 231/936/231 229/935/229 75/937/75 >> f 227/2/227 231/936/231 230/10/230 >> f 72/75/72 695/960/695 1346/3/1346 >> f 695/960/695 2/1352/2 1345/1328/1345 >> f 1346/3/1346 1345/1328/1345 73/938/73 >> f 229/935/229 1346/3/1346 233/939/233 >> f 654/7/654 232/6/232 75/937/75 >> f 233/939/233 236/4/236 654/7/654 >> f 75/937/75 233/939/233 654/7/654 >> f 644/5/644 236/4/236 233/939/233 >> f 73/938/73 234/1340/234 644/5/644 >> f 233/939/233 73/938/73 644/5/644 >> f 236/4/236 644/5/644 647/940/647 >> f 644/5/644 234/1340/234 645/859/645 >> f 647/940/647 645/859/645 646/234/646 >> f 643/8/643 647/940/647 235/1032/235 >> f 232/6/232 654/7/654 656/941/656 >> f 654/7/654 236/4/236 643/8/643 >> f 656/941/656 643/8/643 655/231/655 >> f 653/942/653 656/941/656 655/231/655 >> f 666/15/666 242/943/242 71/9/71 >> f 230/10/230 244/16/244 666/15/666 >> f 71/9/71 230/10/230 666/15/666 >> f 658/12/658 244/16/244 230/10/230 >> f 75/937/75 232/6/232 658/12/658 >> f 230/10/230 75/937/75 658/12/658 >> f 244/16/244 658/12/658 660/11/660 >> -------------------------- >> Here is the code I use for reading that : >> > > Here is my function for reading OBJ faces: > > alias char[] string; > > void read_face( string data, Group target ) > { > if ( target is null ) throw new Exception("Face data with no group found!" ); > string[] info = split( data ); > if ( info.length != 3 ) throw new Exception("Malformed face data:" ~ data ); > > face* f = target.addface(); > void add( int which, string vi, string ci ) > { > f.v[which] = atoi(vi)-1; > f.c[which] = atoi(ci)-1; > } > > void add_info( int index ) > { > string s = info[index]; > string[] arr = split( s, "/" ); > if ( arr.length<2 ) throw new Exception("Malformed face data group:"~ s ); > else add( index, arr[0], arr[1] ); > } > > add_info( 0 ); > add_info( 1 ); > add_info( 2 ); > } > > -DavidM > Thank you for reply. I still haven't solved that sscanf problem event with C strings. I tried to replicate the problem with a new project, and it worked fine. Still I used exactly the same code ! Can anyone take a look at the code, here is the link for the projects http://adogames.com/programming/problem.zip (One of them uses - with problem uses Derelict ) |
July 06, 2006 Re: sscanf problem, | ||||
---|---|---|---|---|
| ||||
Posted in reply to DMINATOR | On Thu, 06 Jul 2006 21:17:09 +0300, DMINATOR <kna_int@mail.ru> wrote: > On Wed, 05 Jul 2006 14:22:02 +0300, David Medlock <noone@nowhere.com> wrote: > >> DMINATOR wrote: >>> Hi >>> I have a little strange problem, probably I am doing something wrong. >>> I am writing a small parser for an 3d .OBJ format. I am using sscanf for >>> parsing. Most of the results are correct, except one place. >>> Here is the part of input text file: >>> g object_1 >>> f 12/934/12 228/1/228 231/936/231 >>> f 228/1/228 72/75/72 229/935/229 >>> f 231/936/231 229/935/229 75/937/75 >>> f 227/2/227 231/936/231 230/10/230 >>> f 72/75/72 695/960/695 1346/3/1346 >>> f 695/960/695 2/1352/2 1345/1328/1345 >>> f 1346/3/1346 1345/1328/1345 73/938/73 >>> f 229/935/229 1346/3/1346 233/939/233 >>> f 654/7/654 232/6/232 75/937/75 >>> f 233/939/233 236/4/236 654/7/654 >>> f 75/937/75 233/939/233 654/7/654 >>> f 644/5/644 236/4/236 233/939/233 >>> f 73/938/73 234/1340/234 644/5/644 >>> f 233/939/233 73/938/73 644/5/644 >>> f 236/4/236 644/5/644 647/940/647 >>> f 644/5/644 234/1340/234 645/859/645 >>> f 647/940/647 645/859/645 646/234/646 >>> f 643/8/643 647/940/647 235/1032/235 >>> f 232/6/232 654/7/654 656/941/656 >>> f 654/7/654 236/4/236 643/8/643 >>> f 656/941/656 643/8/643 655/231/655 >>> f 653/942/653 656/941/656 655/231/655 >>> f 666/15/666 242/943/242 71/9/71 >>> f 230/10/230 244/16/244 666/15/666 >>> f 71/9/71 230/10/230 666/15/666 >>> f 658/12/658 244/16/244 230/10/230 >>> f 75/937/75 232/6/232 658/12/658 >>> f 230/10/230 75/937/75 658/12/658 >>> f 244/16/244 658/12/658 660/11/660 >>> -------------------------- >>> Here is the code I use for reading that : >>> >> >> Here is my function for reading OBJ faces: >> >> alias char[] string; >> >> void read_face( string data, Group target ) >> { >> if ( target is null ) throw new Exception("Face data with no group found!" ); >> string[] info = split( data ); >> if ( info.length != 3 ) throw new Exception("Malformed face data:" ~ data ); >> >> face* f = target.addface(); >> void add( int which, string vi, string ci ) >> { >> f.v[which] = atoi(vi)-1; >> f.c[which] = atoi(ci)-1; >> } >> >> void add_info( int index ) >> { >> string s = info[index]; >> string[] arr = split( s, "/" ); >> if ( arr.length<2 ) throw new Exception("Malformed face data group:"~ s ); >> else add( index, arr[0], arr[1] ); >> } >> >> add_info( 0 ); >> add_info( 1 ); >> add_info( 2 ); >> } >> >> -DavidM >> > > > Thank you for reply. > > I still haven't solved that sscanf problem event with C strings. > I tried to replicate the problem with a new project, and it worked fine. Still I used exactly the same code ! > > Can anyone take a look at the code, here is the link for the projects http://adogames.com/programming/problem.zip (One of them uses - with problem uses Derelict ) Sorry that was http://adogames.com/programing/problem.zip P.S. Is there any D sscanf analog ? |
July 06, 2006 Re: sscanf problem, | ||||
---|---|---|---|---|
| ||||
Posted in reply to DMINATOR | "DMINATOR" <kna_int@mail.ru> wrote in message news:op.tb95hmzvfa6o3s@kna-x0tr7o23p0o.infonet.ee... On Thu, 06 Jul 2006 21:17:09 +0300, DMINATOR <kna_int@mail.ru> wrote: P.S. Is there any D sscanf analog ? There is, but for some reason, it's not a separate function. It's defined in std.stream.Stream, and is the method .readf(). If your input is a Stream (such as a std.stream.File), you can use readf to extract data from it. |
Copyright © 1999-2021 by the D Language Foundation