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 user4funktioniert 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 user4dann 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 user4also 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 Estrcpy ( 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 useraber 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 userdann 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 userobwohl ich die ip1 mit ip2 und port1 mit port2 im Code vergleiche so
strcmp(ip2,ip1)!=0 && strcmp(port2,port1)!=0sieht nicht logisch aus ja??
aber wenn so es vergleichestrcmp(ip2,ip1)==0 && strcmp(port2,port1)==0werden 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 mehr1 == ( 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 ip2das 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