[C++] Bestandsnamen worden verkeerd gemanipuleerd

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DutchNutcase
  • Registratie: Augustus 2005
  • Niet online
Ik zal gelijk melden dat ik geen C++ programmeur ben (staat wel op het to-do lijstje). Ik programmeer voornamelijk Fortran 77/95.

Ik loop met C++ tegen een raar probleem aan. Ik probeer een string uit een inputfile te strippen van de leading spaces en tabs. Daarvoor bestaat al een functie, die gebouwd is door iemand anders. Alleen deze functie doet iets raars met de strings (bestandsnamen voor specifieke inputdata). De bestandsnamen in de inputfile zijn:

code:
1
2
3
4
    grimech30.dat
    thermo30.dat
    crit.dat
    transport.TRANSP


Daar wordt vervolgens van gemaakt:

code:
1
2
3
4
grimec330.dat
therm300.dat
crit.att
transport.TRANSP


Het rare is dus dat transport.TRANSP wel juist geparsed wordt. Het stuk code waar het mis gaat is:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while( !feof(infile()) )
{
        tmp.ScanLine( infile );
        buffer = " ";
        buffer << tmp();
        buffer.Remove( buffer("!") );
        if( buffer.IsGraph() == false )continue;
        while( isgraph( buffer[0] ) == 0 )
        {
                buffer = buffer(1);
        }

        file_name << buffer();

}//while( !feof(infile()) )


Misschien is het ook handig te vermelden dat ik g++ v4.4 gebruik om dit te compilen, maar 4.3 en 4.5 geven hetzelfde probleem. Veel oudere versies van g++ (3.x) geven me niet deze problemen.

Heeft iemand een probleem waar het inzit? Is dit een bekende compilerbug? Of moet ik het in deze code zoeken?

Bij voorbaat dank voor de hulp.

Luctor et Emergo || specs


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 16:10
Heb je al gedebugd??

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • DutchNutcase
  • Registratie: Augustus 2005
  • Niet online
Ja, met een aantal printf statements heb ik de fout kunnen isoleren naar het volgende stuk

C++:
1
2
3
4
while( isgraph( buffer[0] ) == 0 )
{
        buffer = buffer(1);
}


De eerste spatie (van de initialisatie buffer =" ";) wordt keurig gestript zonder dat er iets vreemds gebeurt. De tab wordt er ook netjes uitgehaald in de tweede pass, maar dan worden dus ook de strings op ongewenste manier verbouwd.

Het maakt daarbij verder niet uit of ik in de inputfile de tabs eruit sloop.

edit: opgelost en ik ben een aap.

Via een intermediate variabele wil het wel:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while( !feof(infile()) )
{
        tmp.ScanLine( infile );
        buffer = " ";
        buffer << tmp();
        buffer.Remove( buffer("!") );
        if( buffer.IsGraph() == false )continue;
        while( isgraph( buffer[0] ) == 0 )
        {
                temp = buffer()
                buffer = temp(1);
        }

        file_name << buffer();

}//while( !feof(infile()) )

[ Voor 33% gewijzigd door DutchNutcase op 15-02-2011 15:21 . Reden: opgelost ]

Luctor et Emergo || specs


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Standaard fout. Eof is niet helderziende.

Overigens maak je gebruik van niet-standaard classes. We weten niet hoe die werken dus we kunnen ook niet zeggen of ze goed gebruikt worden.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein