[c++] lege regels aan einde file

Pagina: 1
Acties:
  • 191 views sinds 30-01-2008
  • Reageer

  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
hi,

even een vraagje... ik krijg en file met wat junk tussen de data die ik nodig heb en aan het eind wat lege regels...

Nou maakt het momenteel uit hoe ik het inlees....
Als het een schone file is (handmatig alle junk eru8it gehaald en lege regels weggehaald dan is het geen probleem....

Als het alleen de junk bevat (dus geen lege regels meer aan het eind) dan geeft hij bij de 3e regel ofzo die hij inleest een fout....

Als hij en junk en lege regels bevat dan klopt er niks van de output en leeest hij 4 regels in ofzo...

Kortom ik probeer een file in te lezen zoals ik hem aan geleverd krijg... maar zit met wat problemen.....

In eerste instantie:
Die lege regels...
Ik probeer het volgende:
strlen(Temp1 != 0)
Omdat Temp1 de eerste string zou moeten zijn maar die leest nooit een lege regel in.... dus dat werkt niet. Die leest altijd door totdat hij een string tegen komt...
Verder aangezien ik die hele regels blauw kan maken staan er waarschijnlijk dus allemaal space characters... maar een strcmp op lege spaties werkt natuurlijk om dezelfde reden niet :(
Sterker nog hij ziet de laatste regel 2x :?

Dan zit ik nog met de junk...
Om de een of andere reden schopt dat ook alles in de war...
Das niet echt de bedoeling.....
Hij leest prima in wat de junk is en doet er verder niks mee... maar loopt er wel op vast :(

Die begint altijd met een LORD3 en gaat dan geloof 13 strings door..
Dus die probeer ik te pakken te krijgen met mijn fscanf functie maar om de een of andere reden loopt dat dus ook nog niet lekker....


De file: orders4.txt

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
void Problem::ReadOrders(char *mFileName)
{
    char    Temp1[12], Temp2[8], Temp3[8], Temp4[8], Temp5[8], Temp6[8], Temp7[8], Temp8[5], Temp9[6], Temp10[6], Temp11[6], Temp12[12], Temp13[4], Temp14[4]; 
    FILE    *f = (FILE *)NULL;
    f = fopen(mFileName, "r");  
    while(!feof(f))
    {   
        DEntityPtr mDEntityPtr = new DEntity(Count);
        mDiGraphPtr->AddNode(mDEntityPtr);      
        fscanf(f,"%s %s %s %s %s %s %s %s %s %s %s %s %s %s",Temp1,Temp2,Temp3,Temp4,Temp5,Temp6,Temp7,Temp8,Temp9,Temp10,Temp11,Temp12,Temp13,Temp14);
        if(!strcmp(Temp1,"LORD3"))
        {
            fscanf(f,"%s %s",Temp2,Temp3);
        }
        else
        {
            Count++;
            mDEntityPtr->mOrderNr = Temp1;
            mDEntityPtr->mDemand1 = atoi(Temp2);
            mDEntityPtr->mDemand2 = atoi(Temp3);
            mDEntityPtr->mDemand3 = atoi(Temp4);
            mUnScheduledOrders.AddAtEnd(mDEntityPtr);   
        }   
    }
    fclose(f);
}

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Kun je niet een hele regel inlezen en die daarna parsen als de regel bevat wat je zoekt?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je een voorbeeld textfiletje posten, want ik snap geen reet van je verhaal.
Wat bedoel je bijvoorbeeld met "junk"?

(en plz, noem die vars nou geen temp1 t/m temp14!! :) gebruik gewoon een std::vector van std::strings oid)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
tekstfiletje zit erin...

de regel boven mijn code.......

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

oh sorry, compleet overheen gekeken :)
Maar wat is precies de junk? Alles wat geen getallen zijn zeg maar?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
LORD3 Page 1

Delivery Pickup
Shipment numbeLbs Skid Pieces Lbs Skid Pieces Tijd1 Tijd2 Tijd3 Tijd4Origineel


Dat definieer ik hier even als junk... is eigenlijk de header... het nummer achter page varieert... (loopt op) en soms staat er een eind line voor LORD3...

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Volgens mij kan je het beter wat georganiseerder aanpakken, bijvoorbeeld steeds een hele regel inlezen, trimmen (whitespace ervoor en erna weghalen) en dan verwerken. Die 'newline' voor LORD3 is trouwens geen newline maar een form feed (page break, 0x0C). Deze staat achter elk stuk data.

Maak wat herkenningspunten: 'LORD3' aan het begin betekent een stuk nieuwe data, gevolgd door drie regels die je niet interessant vindt. Vervolgens een lijst data in hetzelfde formaat, totdat je een form-feed teken tegenkomt (enige vervelende is dat die form-feed niet op een eigen regel staat maar aan het begin van de volgende).

www.madwizard.org


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het kan in principe nog simpeler, aan de tekst te zien. Als de regel begint met een digit, dan is het data waarin je geinteresseerd bent. Eventueel zou je het idd nog kunnen opsplitsen in woorden (die gescheiden zijn door whitespaces). Als een regel 14 woorden telt en elk woord begint met een digit, dan is het data.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Overigens geeft (f)scanf het aantal correct geconverteerde velden terug.

Je zou dus ook direkt in variabelen kunnen lezen en kijken of ze allemaal geconverteerd zijn.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Hmmz... tijd over :)

met deze code kon ik je bestand goed inlezen. ( Er staat niet genoeg error checking in trouwens ;) )

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
struct filerecord
{
    const static int NUM_FIELDS = 14;

    char    shipment[11];
    uint    weight;
    uint    skid;
    uint    pieces;
    uint    unitweight;
    uint    unitskid;
    uint    unitpieces;
    char    t_1[6];
    char    t_2[6];
    char    t_3[6];
    char    t_4[6];

    ulong   somenumber_1;
    uint    somenumber_2;
    uint    somenumber_3;
};

int main()
{
    FILE * f = fopen( "c:/orders4.txt", "r+" );

    while( f && !feof( f ) )
    {
        filerecord r = { 0 };

        int num = fscanf( f, "%10s %u %u %u %u %u %u %5s %5s %5s %5s %lu %u %u",
                        r.shipment, &r.weight, &r.skid, &r.pieces, &r.unitweight, &r.unitskid, &r.unitpieces, 
                        r.t_1, r.t_2, r.t_3, r.t_4, &r.somenumber_1, &r.somenumber_2, &r.somenumber_3 );

        if(  num != filerecord::NUM_FIELDS )
        {
            printf("Not a valid line\n");
            int a = 0;
            
            do
            {
                a = fgetc( f );
            }
            while( a != 0x0A && a != EOF );

        }
        else
        {
            static int numok = 0;

            printf("Valid lines read : %d\n", ++numok );
        }
    }
    fclose( f );
    cin.get();
    return 0;
}



Overigens is dit geen correcte C++ applicatie.

[ Voor 8% gewijzigd door farlane op 03-09-2003 13:53 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

De tijden zou je nog meteen kunnen converteren dmv het scannen naar %u:%u :)
(je hebt trouwens code=c gedaan terwijl het c++ is ;)

Maar als het toch c++ is, gebruik dan gewoon de streams etc., dat werkt een stuk makkelijker :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
.oisyn schreef op 03 September 2003 @ 13:54:
De tijden zou je nog meteen kunnen converteren dmv het scannen naar %u:%u :)
(je hebt trouwens code=c gedaan terwijl het c++ is ;)
Je hebt natuurlijk gelijk, maar ik vond het ook geen correcte C++ :)
Maar als het toch c++ is, gebruik dan gewoon de streams etc., dat werkt een stuk makkelijker :)
Das ook mijn idee, maar misschien dat de ts graag iets met fscanf wilde zien.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
.oisyn schreef op 03 September 2003 @ 13:54:
De tijden zou je nog meteen kunnen converteren dmv het scannen naar %u:%u :)
(je hebt trouwens code=c gedaan terwijl het c++ is ;)

Maar als het toch c++ is, gebruik dan gewoon de streams etc., dat werkt een stuk makkelijker :)
Kun je me misschien dan ook laten zien hoe het met met streams werkt? Denk dat ik daar namelijk ook wel wat van zal leren..

en thnx farlane voor de code

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Lord_T schreef op 03 September 2003 @ 15:32:
Kun je me misschien dan ook laten zien hoe het met met streams werkt? Denk dat ik daar namelijk ook wel wat van zal leren..
deze code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    ShipmentReader reader( "c:/orders4.txt" );

    if( reader.openShipmentFile() )
    {
        reader.readShipmentFile();
        reader.closeShipmentFile();
    }

    cout<<"Number of shipments read : "<<reader.getShipmentCount()<<"\n";

    cin.get();
    return 0;
}


geeft bij mij deze output :
Number of shipments read : 139
>:)
en thnx farlane voor de code
np

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
Shipmentreader heb je zeker zelf aangemaakt?

Om te kijken hoe het precies in elkaar steekt moet je eens in de MSDN library kijken onder:

ifstream
ofstream
fstream

of gewoon onder de "hoogste", ios (input output stream), en dan verder naar benenden werken.

[ Voor 72% gewijzigd door dexter07051982 op 03-09-2003 19:35 . Reden: extra info ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee die zit in de standaard, en het doet toevallig precies wat Lord_T wilt :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
.oisyn schreef op 03 September 2003 @ 19:34:
Nee die zit in de standaard, en het doet toevallig precies wat Lord_T wilt :+
jaja, zal wel. geloof er geen zak van.
ik kan hem niet eens vinden in de msdn en vond wat diegene hem dus vertelde niet echt heel erg uitleggend of helpend.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Nee die zit in de standaard, en het doet toevallig precies wat Lord_T wilt :+
jaja, zal wel. geloof er geen zak van.
ik kan hem niet eens vinden in de msdn en vond wat diegene hem dus vertelde niet echt heel erg uitleggend of helpend.
:) ROFLMPO ........ ( humor is toch een heel persoonlijk iets blijkt maar weer :) )

Btw, ik heb de topistarter mijn code voor de ShipmentReader via mail gestuurd omdat ik vond dat ik hem al wel genoeg had geholpen 'in het openbaar'.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1