Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 2 while schleifen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.06.2004, 15:04 Uhr
~ruuuuudi
Gast


hi, habe ein problem mit einem programm in dem 2 while-schleifen vorkommen. mein programm soll eine datei auslesen (z.b. Test.tst), diese datei von datenmüll entfernen und in out.txt speichern. In out.txt stehen jetzt Sachen wie z.B:
C++:
<test>   345     Programmer
            peter  = 123
            hans   = 234
             ...



Weiterhin soll während des Programmes eine zweite datei (z.b. bat.txt) eingelesen werden, die z.B. so aussieht:

C++:
222    tester
         karl = 334
345    Programmer
         hans = 000
555    regisseur
         frauke = 7
...


das ganze sieht jetzt vielleicht etwas verwirrend aus, ist aber im prinzip einfach zu verstehen.
Das Programm solll wie gesagt anfangs den Datenmüll aus test.tst entfernen und in out.txt speichern (nicht den Datenmüll, sondern den Rest)
Anschließend wird überprüft ob out.txt datendätze besitzt, wenn ja, dann sollen die einzelnen Zeilen von out.txt überprüft und gespalten werden. dafür habe ich zwei funktionen, eine zum splitten, und eine um die führenden whitespaces zu entfernen. das klappt auch soweit perfekt. So: jetzt mein Problem: Also nachdem die test.txt eingelesen wurde (zeilenweise) wird die bat.txt zeilenweise überprüft ob sich da z.b. eine Gruppennummer 345 mit dem Namen Programmer befindet. Wenn ja, dann soll die nächste Zeile überprüft werden, wieder gesplittet und die quasi veränderten werte sollen in die bat.txt eingetragen werden.
Bsp. wenn vorher da stand hans = 234 soll danach in der Zeile Hans = 000 stehen, da hans ja der Gruppennummer und der gruppe angehört.
Bisher habe ich da etwa so gelöst: Habe es kommentiert um nicht den ganzen Code zu posten, ist nämlich ganz schön long

C++:
batfile = fopen("bat.txt","w");  //sieht wie oben aus
testfile = fopen("test.tst","r"); //sieht wie oben aus
out = fopen("out.txt","w"); // hier ist alles ohne datenmüll drin

//dann fange ich an:
while ( fgets (in, MAX_LEN, test) != NULL)
{
    //datenmüllbeseitigung
    //alles bei dem int read =0 ist, fliegt jetzt raus

    if(read!=0)
    {
        if (strstr (in,"<test>") != NULL)
        {
           //um sich die gruppe zu merken und die Zeile <test>   345   Programmer zu splitten und die einzelteile zu merken
        }
        else
        {
             // wenn nicht <test> drin ist, dann splitte die Zeile und speichere die Werte in par und wer.(Bsp.: par = Hans
                                           wer = 234)
        }

        /*jetzt kommt glaube mein problem: Nachdem ich nun parameter und wert und gruppe habe, will ich die bat.txt zeilenweise überprüfen ob dort die werte vorkommen und zwar so:*/
        while(fgets(buffer, MAX_LEN, batfile) != NULL)
        {
            if (( strstr (buffer,groupname) != NULL)  &&  ( strstr (buffer,grnumber) !=NULL))
            {
                /*Quasi wenn der gruppenname, der zuvor gespeichert wurde und die gruppennummer übereinstimmen und in der bat-datei gefunden wurden, sollen jetzt ab da die werte geändert werden. */
                 printf(buffer);
                   .......... //hier stehen jetzt alle zeilen, die den gruppennamen und die gruppennummer beinhalten.
            }



So, aber wie kann ich jetzt weiter machen? Oder bin ich schon auf dem falschen dampfer??? bei mir wird bis hierher die zweite while-schleife nur einmal durchlaufen. Im prinzip müsste die ja mindestens so oft durchlaufen werden, wie die test.tst Zeilen hat oder nicht? Ach ich weiß nicht mehr weiter, hoffe jemand kann mir weiter helfen insofern mein problem überhaupt verstanden wurde. *SCHNIEF*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.06.2004, 15:13 Uhr
~Ruuuuudi
Gast



Zitat:
wenn vorher da stand hans = 234 soll danach in der Zeile Hans = 000 stehen, da hans ja der Gruppennummer und der gruppe angehört.


sorry, ich meine es natürlich genau umgekehrt. In der test.tst steht Hans = 234. das ist der neue wert. nun wird in der bat.txt überprüft ob da Gruppenname und Gruppennummer übereinstimmen, und ob in den nächsten zeilen der bereits gespeicherte parameter (hans) vorkommt. wenn ja, soll in der bat.txt der wert 000 durch 234 ersetzt werden. Sprich, es steht nur noch da Hans =234...

Aber wie kann ich ran gehen oder weiter machen???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.06.2004, 15:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


lies erstmal in ein array (ein array aus nem struct) ein und mach dann die ersetzungen... danach baller das ganze wieder in ne datei
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.06.2004, 10:09 Uhr
~Ruuuuudi
Gast



Zitat:
Windalf postete
lies erstmal in ein array (ein array aus nem struct) ein und mach dann die ersetzungen... danach baller das ganze wieder in ne datei



wie kann ich das machen? Kannst du mir mal ein Beispiel dafür geben, wie ich mein array sinnvoll fülle???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.06.2004, 11:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja also das schlimme bei dir scheint mir das du das anscheinend unbedingt in c machen willst... was dann heisst du musst dich mit dynamischer speicherallokierung auseinandersetzen...(belastende sache)... oder weisst du von vornherrein wieviele datensätze du maximal hast?...

hmm und wenn die datei mehrer 100Mb gross ist wäre die von mir vorgeschlagene Lösung wohl auch nicht gerade geil da müsste man sich wohl richtig nen Kopf machen...
in c++ wärs doch recht einfacher als sich das in c anzutun

an sonsten in etwa so

C++:
typedef struct{char name[128];int number}person;

//so von person machst du ein array und liest dann in dieses array ein...
person parray[100]; //wenn man mit vielen datensätzen rumhantiert muss mans wie gesagt auf dem heap allokieren udn ggf dynamisch machen...

//hier ins array einlesen

//dann gehst du das array immer auf eventuelle änderungen durch... den gleichen namen findest du mit strcmp...

//und wenn du fertig bist das array einfach wieder in ne datei ballern... das ist dann wohl der einfachste teil...



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.06.2004, 12:04 Uhr
~Ruuuudi
Gast


Ja, wollte eigentlich komplett in C programmieren.
Wie hättest du es denn in c++ gemacht? wenn das so viel einfacher ist und ich in c keine vernünftige Lösung finde, dann würde ich evtl. auf c++ umsteigen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.06.2004, 12:10 Uhr
ao

(Operator)


In C++ gibt leistungsfähige Hilfsklassen zur String-Verarbeitung (std::string), die einem das lästige und fehlerträchtige Speichermanagement abnehmen. Insofern wär das schon einfacher (wenn es nicht gerade Zweck der Übung ist, sich mit Speicher herumzuschlagen).

Es gibt zwar auch String-Bibliotheken für C, aber nicht im Standard.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.06.2004, 12:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich seh gerade das läuft in zwei verschiedenen foren aufeinmal.. damit nicht alle antworten doppelt gegeben werden bzw. man sich an der antwort eines andere orientieren kann...
www.c-plusplus.de/forum/viewtopic.php?t=76164&highlight=
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.06.2004, 14:52 Uhr
~Ruuuuudi
Gast


Sorry. dass ich schon wieder hier poste, aber mein anderes Forum funzt grad nicht mehr...
wie die datei aussehen soll, darüber brauche ich mir keine Gedanken machen, denn die Datei (test.txt) wird mir zur verfügung gestellt. und die sieht auf jeden Fall immer so aus:

C++:
<test>     455     producer
           gerd = "3456654"
           peter = "5586854"
           Heinz = "585854"
<test>     123     tester
           lutz = "993"
<test>     999     writer
           wilma = "3345"

      ...   ...   ...


was soll ich da nur für eine struktur schaffen? Jeweils die erste Zeile von einem solchen eintrag beginnt mit <test>, gefolgt von whitespaces, dann kommt die GrNummer, dann der Gruppenname. Alle Zeilen darunter haben die Form: whitespaces am anfang, dann der parameter (gerd bzw. Name), dann der wert (Bsp: "3456654").
... bis halt wieder eine Zeile mit test kommt.
ich habe mir ja überlegt, irgendwie den Datensatz anders aufzubauen. Und zwar, sobald <test> im string erscheint wird sich die gruppennummer und der gruppenname gemerkt. Anschließend wird in die nächste zeile gegangen, und dort an den namen (z.B. gerd) der gruppenname und die GrNummer angehängt werden und letztendlich 4 Datensätze in einer Zeile stehen.
Bsp.:

Code:
455    producer      gerd   =    "3456654"
455    producer      peter  =    "5586854"
455    producer      Heinz  =    "585854"
123    tester        lutz   =    "993"


... und wenn ich dann so eine Form habe, dann lässt sich leichter ein struct bilden oder???
z.B.

C++:
typedef struct
{
   int GrNumber[MAXSPALTEN];
   char GrName[MAXSPALTEN];
   char name[MAXSPALTEN];
   char number[MAXSPALTEN];
}zeile;



Könnte das so klappen? Weiß echt nicht wie ich das sonst anstellen sollte. Die Dateien sehen im Original exakt so aus, wie ich sie hier gepostet habe. Hoffe auf positive antworten.

Hier kann die Antwort auch hingeschrieben werden, damit nicht alles doppelt ist. Danke..
www.c-plusplus.de/forum/viewtopic.php?t=76164&highlight=
www.c-plusplus.de/forum/viewtopic.php?t=76164&highlight=


Bearbeitung von typecast:
Formatierung korrigiert.

Dieser Post wurde am 11.06.2004 um 07:25 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: