Textdatei auslesen und eine andere Textdatei schreiben?



  • Kannst ja die Zeilen mit sscanf zerlegen, dann kannst du dir jedes einzelne Bestandteil einer Zeile angucken.
    Wieso morgen erst, has du keinen Compiler zu hause ?
    Und das so kurz vor der Abgabe ! 😮



  • B.B. schrieb:
    has du keinen Compiler zu hause ?

    nein nicht deswegen brauche dafür meine ganze analyseplattform (Server telefone ...muss alles automatisch funktionieren) und das habe ich nicht zuhause
    habe eben andere frage rein was mit zeitstempel wenn du mal eine idee hast?
    danke noch mal für hilfe..



  • Naja, diese verkehrsdaten.txt-Geschichte, die könntest du doch auch zu Hause zum laufen kriegen.
    Brauchst ja nur ne Textdatei mit deinen AE-Strings.



  • ja schon, habe ich versucht mit der Dev-C++ Compiler versucht aber irgendwie klappt nicht bekomme ein paar wahrnungen dafür habe keine lösung gefunden..deswegen



  • azoul schrieb:

    ja schon, habe ich versucht mit der Dev-C++ Compiler versucht aber irgendwie klappt nicht bekomme ein paar wahrnungen dafür habe keine lösung gefunden..deswegen

    Was für Warnungen denn? Warnungen sind keine Fehler und eventuell ganz unkritisch.



  • hallo B.B.
    habe ich heute morgen versucht, hat alles geklappt. da ich Änderungen an Verkehrsdaten gemacht habe also das Codec zu 'E' zeile manuell hinzugefügt habe.
    das problem jetzt ist es so: das codec könnte nur für 'A' zeile (nur am Anfang der telefonat werden die Codecs zwischen zwei user ausgehandelt) ausgelesen wird. am Ende der Telefonat werden keine Codecs ausgehandelt das hat zu folge dass das Codec in 'E' zeile nicht auftaucht. was kann ich an dem C-code ändern, dass das trotzdem funktioniert.



  • Du kannst die Zeilen in einzelne Komponenten aufteilen und diejenigen, die dich interessieren, miteinander vergleichen.



  • habe gemeint im C-code, der du gschrieben und geschickt hast. was kann ich da machen?



  • 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); 
    }
    

Anmelden zum Antworten