Textdatei auslesen und eine andere Textdatei schreiben?



  • Natürlich im C-Code, wo denn sonst. An der Position, wo die Zeilen eingelesen werden, kannst du diese mit

    sscanf ( A, "%s %s %s %s %s %s %s %s", AoE, ipA1, ipA2, portA1, portA2, codec, nameA1, nameA2 ); 
    sscanf ( B, "%s %s %s %s %s %s %s %s", AoE, ipE1, ipE2, portE1, portE2,nameE1, nameE2 );
    

    aufteilen. Und dann kannst du die einzelnen char-Arrays, die dich interessieren, vergleichen.
    Z.B.

    if ( strcmp ( ipA1, ipE1 ) == 0 && strcmp  ( ipA2, ipE2 ) == 0 && ... // usw.
    


  • jetzt macht er das , aber er liest nur das erste paar von der textdatei verkehrsdaten dann hört er auf weiter zu machen..



  • Geh doch mal für jede Zeile mit nem Debugger durch, dann findest du schon den Grund.



  • funktioniert aber gibt nur die A zeile und E Zeile mit gleicher Inhalt, die nacheinander vorkommen,aus. wenn aber eine andere A Zeile dazwischen kommt dann wird ie erste A zeile mit der zweiten überschrieben. also ein Beispiel:

    wenn so aussieht:
    A 192.168.0.84 6516 192.168.0.221 6396 0 user user1
    A 192.168.0.84 6516 192.168.0.221 6396 0 user user1
    A 192.168.0.84 6516 192.168.0.221 6396 0 user user1
    E 192.168.0.84 6516 192.168.0.221 6396 user user1
    A 192.168.0.121 10020 192.168.0.123 5062 8 user3 user4
    A 192.168.0.121 10020 192.168.0.123 5062 8 user3 user4
    A 192.168.0.121 10020 192.168.0.123 5062 8 user3 user4
    E 192.168.0.121 10020 192.168.0.123 5062 user3 user4

    funktioniert einwandfrei...!!

    wenn so aussieht:

    A 192.168.0.84 6516 192.168.0.221 6396 0 khalid user1
    A 192.168.0.84 6516 192.168.0.221 6396 0 khalid user1
    A 192.168.0.84 6516 192.168.0.221 6396 0 khalid user1
    A 192.168.0.121 10020 192.168.0.123 5062 8 user3 user4
    E 192.168.0.84 6516 192.168.0.221 6396 khalid user1
    E 192.168.0.121 10020 192.168.0.123 5062 user3 user4

    dann geht leider nicht.. und er schreibt das in textdatei Feld.txt

    A 192.168.0.84 6516 192.168.0.221 6396 0 khalid user1
    E 192.168.0.84 6516 192.168.0.221 6396 0 khalid user1
    A 192.168.0.84 6516 192.168.0.221 6396 khalid user1
    E 192.168.0.121 10020 192.168.0.123 5062 8 user3 user4

    also die richtige A zeile für die letzte E zeile hat er nicht ausgegeben.?
    sorry...



  • Nö, es ist egal, wie viele A- oder E-Zeilen dazwischen liegen. Auch die letzte E-Zeile wird berücksichtigt (liest bis EOF).
    Ich kann ja von hier schlecht raten, was du da jetzt getippt hast, ne.
    Vielleicht sind dir auch nur beim Erstellen deiner Testdatei ausversehen ein paar Leerzeichen bei einigen Zeilen hinten dazugekommen und bei einigen nicht, oder so.



  • Big Brother schrieb:

    Ich kann ja von hier schlecht raten, was du da jetzt getippt hast, ne.

    ich habe gar nix fetippt ausser die Änderung mit Vergleich mehr nicht..

    sscanf ( A, "%s %s %s %s %s %s %s %s", AoE, Aip1, Aip2, Aport1, Aport2, codec, Aname1, Aname2 ); 
    sscanf ( B, "%s %s %s %s %s %s %s %s", AoE, Eip1, Eip2, Eport1, Eport2, Ename1, Ename2 );
    
    if ( strcmp(Aip1, Eip1) == 0 && strcmp(Aip2, Eip2) == 0 && strcmp( Aport1, Eport1) == 0 && strcmp(Aport2, Eport2) == 0 && strcmp(Aname1, Ename1) == 0 && strcmp( Aname2, Ename2 ) == 0 )
    


  • azoul schrieb:

    ...ich habe gar nix fetippt ausser die Änderung mit Vergleich mehr nicht..

    Du überschreibst mit sscanf ( B, .. die vorher eingelesenen Werte wieder, weil du die selben Variablen benutzt.
    Und das: strcmp(ip1, ip1) überdenke in Ruhe noch einmal.



  • azoul schrieb:

    ich habe gar nix fetippt ausser die Änderung mit Vergleich ...

    Das hat ja offensichtlich schon gereicht!

    azoul schrieb:

    ..mehr nicht..

    Na, Gott sein Dank!

    🙂



  • azoul schrieb:

    if ( strcmp(ip1, ip1) == 0 && strcmp(ip2, ip2) == 0 && strcmp( port1, port1) == 0 && strcmp(port2, port2) == 0 && strcmp(name1, name1) == 0 && strcmp( name2, name2 ) == 0 )
    

    Na auf das Ergebnis darfst du ja jedesmal aufs Neue gespannt sein! 😃



  • hallo leute nicht viel lachen.. 😃 😃 😃



  • hallo B.B..
    vielleicht die letzte Frage zu den Code:

    wenn ich das allein in der konsolle ausführe macht er alles wunderbar aber wenn das programm in eindere aufrufe passiert folgendes:

    er schreibt den inhalt der A zeile in der E zeile und umgekehrt..
    also der Code macht folgendes: liest erste A zeile aus der datei und kopiert das in B mit E

    strcpy ( B, A ); 
    B [0] = ENDE;
    

    ich habe das Programm in andere programm, das auf dauer läuft(Endlose Schleife), aufgerufen damit es alles automatisch läuft

    er hat

    if ( A [0] == ANFANG && 0 == haveA ( A, Result )) 
            { // Zeile beginnt mit A und existiert nicht in feld.txt 
                if ( 0 != fgetpos ( fData, &pos )) // Dateizeiger sichern. 
                    error_exit ( "fgetpos failed. " ); 
    
                strcpy ( B, A ); 
                B [0] = ENDE; 
    
                while ( NULL != ( fgets ( A, sizeof ( A ), fData ))) 
                { // Suche nach der zugehörigen E-Zeile 
    
                    if ( 0 != ferror ( fData ) ) 
                        error_exit ( "fgets failed. " ); 
    
                    if ( 0 == strcmp ( A, B )) 
                    { // Die zur A-Zeile zugehörige E-Zeile gefunden. 
                        A [0] = ANFANG; 
                        addAB ( A, B, Result ); // Unikat-Paar hinzufügen. 
    
                        break; // Bricht die innere while-Schleife ab. 
                    } 
                } 
    
                if ( 0 != fsetpos ( fData, &pos )) // Dateizeiger an gesicherte Position setzen. 
    
                    error_exit ( "fgetpos failed. " ); 
            }
    

    kannst du noch helfen...



  • habe ein frage zu meiner Code wenn jemand da helfen kann..
    also das Programm macht alles richtig wenn die datei Verkehrsdaten so aussieht:

    A 192.168.0.84 5910 192.168.0.221 5796 0 user user1
    A 192.168.0.84 5910 192.168.0.221 5796 0 user user1
    A 192.168.0.84 5910 192.168.0.221 5796 0 user user1
    E 192.168.0.84 5910 192.168.0.221 5796 user user1
    A 192.168.0.160 10460 192.168.0.151 10164 0 user3 user2
    E 192.168.0.160 10460 192.168.0.151 10164 user3 user2
    A 192.168.0.221 5806 192.168.0.84 5920 0 user1 user
    E 192.168.0.221 5806 192.168.0.84 5920 user1 user

    aber wenn die datei Verkehrsdaten so aussieht: die drei ersten A zeilen habe die gleiche Inhalt

    A 192.168.0.84 5910 192.168.0.221 5796 0 user user1
    A 192.168.0.221 5796 192.168.0.84 5910 0 user1 user
    A 192.168.0.221 5796 192.168.0.84 5910 0 user1 user
    E 192.168.0.221 5796 192.168.0.84 5910 user1 user
    A 192.168.0.160 10460 192.168.0.151 10164 0 user3 user2
    E 192.168.0.160 10460 192.168.0.151 10164 user3 user2
    A 192.168.0.221 5806 192.168.0.84 5920 0 user1 user
    E 192.168.0.221 5806 192.168.0.84 5920 user1 user

    dann macht folgendes: die zwei ersten A zeilen habe den gleichen Inhalt

    A 192.168.0.84 5910 192.168.0.221 5796 0 user user1
    A 192.168.0.221 5796 192.168.0.84 5910 0 user1 user
    E 192.168.0.221 5796 192.168.0.84 5910 user1 user
    A 192.168.0.160 10460 192.168.0.151 10164 0 user3 user2
    E 192.168.0.160 10460 192.168.0.151 10164 user3 user2
    A 192.168.0.221 5806 192.168.0.84 5920 0 user1 user
    E 192.168.0.221 5806 192.168.0.84 5920 user1 user

    obwohl ich die ip1 mit ip2 und port1 mit port2 im Code vergleiche so

    strcmp(ip2,ip1)!=0 && strcmp(port2,port1)!=0
    

    sieht nicht logisch aus ja??
    aber wenn so es vergleiche

    strcmp(ip2,ip1)==0 && strcmp(port2,port1)==0
    

    werden nur die E zeilen in textdatei Feld reingeschrieben...verstehe ich nicht mehr

    #include <stdio.h> 
    #include <unistd.h> 
    #include <string.h> 
    
    //Variableninitialisierung 
    FILE *file, *file1; 
    char data[256], ip1[32], ip2[32], port1[8], port2[8], IP1[32], 
    char IP2[32], codec[8], name1[8], name2[8], AorE[1]; 
    char Session1[32], Session2[32], Session3[32], Session4[32], Session5[32], Session6[32]; 
    char *ptr; 
    int n; 
    
    int main(void) 
    
    { 
    // open a txt file verkehrsdaten 
    file = fopen("/var/tmp/Verkehrsdaten","r"); 
    n=0; 
    
    while(1){     
    
        while(fgets (data, 256, file)) 
        { 
    //hier werden die Daten zeilenweise aus der verkehrsdaten.txt gelesen 
        ptr = strtok(data," "); 
        sprintf(AorE, "%s", ptr); 
    
            if(strstr(AorE, "A")!=NULL) 
            { 
                ptr = strtok(NULL," "); 
                sprintf(ip1, "%s", ptr); 
    
                ptr = strtok(NULL," "); 
                sprintf(port1, "%s", ptr); 
    
                ptr = strtok(NULL," "); 
                sprintf(ip2, "%s", ptr); 
    
                ptr = strtok(NULL," "); 
                sprintf(port2, "%s", ptr); 
    
                ptr = strtok(NULL," "); 
                sprintf(codec, "%s", ptr); 
    
                ptr = strtok(NULL," "); 
                sprintf(name1, "%s", ptr); 
    
                ptr = strtok(NULL," "); 
                sprintf(name2, "%s", ptr); 
    
    //feld.txt wird hier durch file1 zum schreiben geöffnet 
                file1 = fopen("/var/tmp/feld","a"); 
    
    //beispielhafter Vergleich der Daten (funktioniert so nur für die ersten drei Zeilen!) 
    if(strstr(Session2,port1)==NULL && strstr(Session4,port2)==NULL && strstr(Session5,name1)==NULL && strstr(Session6,name2)==NULL 
    && strcmp(ip2,ip1)!=0 && strcmp(port2,port1)!=0 && strcmp(name2,name1)!=0)
    				{	
    fprintf(file1, "%s %s %s %s %s %s %s %s", AorE, ip1, port1, ip2, port2, codec, name1, name2);
    
    if(n==0){strcpy(Session1,ip1);strcpy(Session2,port1);strcpy(Session3,ip2);strcpy(Session4,port2);n++;}
    if(n==1){strcpy(Session1,ip1);strcpy(Session2,port1);strcpy(Session3,ip2);strcpy(Session4,port2);n--;}
    fclose(file1); 
                    } 
    
     //alternative Behandlung, wenn eine Zeile mit "E" markiert ist 
                    if(strstr(AorE, "E")!=NULL) 
                    { 
                        ptr = strtok(NULL," "); 
                        sprintf(IP1, "%s", ptr); 
    
                        ptr = strtok(NULL," "); 
                        sprintf(port1, "%s", ptr); 
    
                        ptr = strtok(NULL," "); 
                        sprintf(IP2, "%s", ptr); 
    
                        ptr = strtok(NULL," "); 
                        sprintf(port2, "%s", ptr); 
    
                        ptr = strtok(NULL," "); 
                        sprintf(name1, "%s", ptr); 
    
                        ptr = strtok(NULL," "); 
                        sprintf(name2, "%s", ptr); 
    
                        file1 = fopen("/var/tmp/feld","a"); 
                        fprintf(file1, "%s %s %s %s %s %s %s", AorE, IP1, port1, IP2, port2, name1, name2); 
                        fclose(file1); 
    
                    } 
    if(strstr(Session1,ip1)!=NULL && strstr(Session2,port1)!=NULL && strstr(Session3,ip2)!=NULL && strstr(Session4,port2)!=NULL) {n=0;}
    if(strstr(Session1,ip1)!=NULL && strstr(Session2,port1)!=NULL && strstr(Session3,ip2)!=NULL && strstr(Session4,port2)!=NULL) {n=1;}        } 
    
        } 
    fclose(file); 
    }
    


  • hallo leute kann jemand helfen...ein logik Fehler ist Code und ich finde es nicht....

    danke im Voraus



  • azoul schrieb:

    obwohl ich die ip1 mit ip2 und port1 mit port2 im Code vergleiche so
    C/C++ Code:
    strcmp(ip2,ip1)!=0 && strcmp(port2,port1)!=0
    sieht nicht logisch aus ja??
    aber wenn so es vergleiche
    C/C++ Code:
    strcmp(ip2,ip1)==0 && strcmp(port2,port1)==0
    werden nur die E zeilen in textdatei Feld reingeschrieben...verstehe ich nicht mehr

    1 == ( strcmp(ip2,ip1) != 0 ) -> ip1 ist nicht gleich ip2
    1 == ( strcmp(ip2,ip1) == 0 ) -> ip1 ist gleich ip2



  • strcmp schrieb:

    1 == ( strcmp(ip2,ip1) != 0 ) -> ip1 ist nicht gleich ip2
    1 == ( strcmp(ip2,ip1) == 0 ) -> ip1 ist gleich ip2

    das weiß ich auch das so ist aber ih meine warum bekomme mit dem code nicht was ich will wenn ich deisem vergleich mache... du kannst bei dir ausprobieren, wenn du mal zeit hast.?



  • azoul schrieb:

    hallo B.B..
    vielleicht die letzte Frage zu den Code:
    wenn ich das allein in der konsolle ausführe macht er alles wunderbar aber wenn das programm in eindere aufrufe passiert folgendes:
    ...

    Wenn das Programm von einem anderen Programm aufgerufen wird, ändert sich prinzipiell nichts an dem Ablauf.

    azoul schrieb:

    ich habe das Programm in andere programm, das auf dauer läuft(Endlose Schleife), aufgerufen damit es alles automatisch läuft

    Gibst du auch genug Zeit, damit sich das aufgerufene Programm beenden kann ?



  • kann jemand helfen den Fehler in meinem Code zu finden..



  • if(strstr(Session2,port1)==NULL && strstr(Session4,port2)==NULL && strstr(Session5,name1)==NULL && strstr(Session6,name2)==NULL
    && strcmp(ip2,ip1)!=0 && strcmp(port2,port1)!=0 && strcmp(name2,name1)!=0)

    Wo hast du den Wert für Session2 her ?
    Bist du Kumpel von Hasso ?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-211540-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html



  • Bing Bang schrieb:

    Bist du Kumpel von Hasso ?

    Der Gedanke kam mir tatsächlich auch schon...



  • habt ihr nichts zu tun ausser die anderen zu beobachten...
    nicht zu fassen das gilt für _matze und Bing Bang


Anmelden zum Antworten