Textdatei auslesen und eine andere schreiben?

Guntpat1981

Mitglied
Ich muss ein c-programm schreiben, das aus eine Textdatei(verkehrsdaten.txt), die ständig ändert, die daten zeilenweise auslesen und in eine andere textdatei(feld.txt) schreibe. In der erste textdatei (verkehrsdaten.txt) kommen die einträge doppelt und mehrfach vor, und das will verhindern in der andere textdatei (feld.txt) vorzukommen. Die Textdateien sehen folgendermaßen aus:

1. Quelle (verkehrsdaten.txt)
Code:
A 192.168.0.84 5996 192.168.0.221 5890 0 user0 user1 
A 192.168.0.84 5996 192.168.0.221 5890 0 user0 user1 
A 192.168.0.84 5996 192.168.0.221 5890 0 user0 user1 
A 192.168.0.123 5062 192.168.0.135 5062 8 user3 user4 
A 192.168.0.123 5062 192.168.0.135 5062 8 user3 user4 
E 192.168.0.84 5890 192.168.0.84 5996 user0 user1 
A 192.168.0.123 5062 192.168.0.135 5062 8 user3 user4 
E 192.168.0.123 5062 192.168.0.135 5062 user3 user4 
A 192.168.0.151 10170 192.168.0.160 10466 0 user user2 
A 192.168.0.84 6000 192.168.0.221 5894 0 user user1 
A 192.168.0.221 5894 192.168.0.84 6000 0 user1 user 
A 192.168.0.221 5894 192.168.0.84 6000 0 user1 user 
E 192.168.0.221 5894 192.168.0.84 6000 user1 user 
E 192.168.0.151 10170 192.168.0.160 10466 user user2
2. Ziel: (feld.txt)
Code:
 A 192.168.0.84 5996 192.168.0.221 5890 0 user0 user1 
A 192.168.0.123 5062 192.168.0.135 5062 8 user3 user4 
E 192.168.0.84 5890 192.168.0.84 5996 user0 user1 
E 192.168.0.123 5062 192.168.0.135 5062 user3 user4 
A 192.168.0.151 10170 192.168.0.160 10466 0 user0 user2 
A 192.168.0.84 6000 192.168.0.221 5894 0 user user1 
E 192.168.0.221 5894 192.168.0.84 6000 user1 user 
E 192.168.0.151 10170 192.168.0.160 10466 user0 user2
habe folgendes mir gedacht:

- Lese erste Zeile aus verkehrsdaten.txt ein
- "A" oder "E"?
wenn "A" ?
- gibt es diese "A" Zeile in textdatei feld.txt schon mal?
-> Nein: dann schreibe diese "A" Zeile in textdatei Feld.txt und lese die nächste zeile aus verkehrsdaten.txt ein.
Ja-> gibt es zu diesr zeile "A" eine "E" im textdatei feld.txt
-> Ja dann schreibe die "A" Zeile in textdatei feld.txt

das ist die c-code die ich geschrieben habe:

Code:
#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <string.h> 
 
 //Variableninitialisierung
FILE *file, *file1; 
char data[256], ip1[32], ip2[32], port1[8], port2[8], IP1[32], IP2[32], codec[8], name1[8], name2[8], AorE[1]; 
char Session1_ip1[32], Session2_ip1[32], Session3_ip1[32], Session4_ip1[32], Session5_ip1[32], Session6_ip1[32], Session7_ip1[32], Session8_ip1[32], Session9_ip1[32], Session10_ip1[32]; 
char *ptr; 
int n; 
 
 
int main(void) 
 
{ 
strcpy(Session1_ip1,"session1"); 
strcpy(Session2_ip1,"session2"); 
strcpy(Session3_ip1,"session3"); 
strcpy(Session4_ip1,"session4"); 
 
 
// open a txt file verkehrsdaten 
file = fopen("/var/tmp/verkehrsdaten2","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(Session1_ip1,ip1)==NULL && strstr(Session2_ip1,port1)==NULL && strstr(Session3_ip1,ip1)==NULL && strstr(Session4_ip1,port1)==NULL)// && strstr(Session3_ip1,ip1)==NULL && strstr(Session3_ip1,port1)==NULL && strstr(Session4_ip1,ip1)==NULL && strstr(Session4_ip1,port1)==NULL) 
            {     
            fprintf(file1, "%s %s %s %s %s %s %s %s", AorE, ip1, port1, ip2, port2, codec, name1, name2); 
                         
 
                if(n==0){strcpy(Session1_ip1,ip1);strcpy(Session2_ip1,port1);} 
                        if(n==1){strcpy(Session3_ip1,ip1);strcpy(Session4_ip1,port1);} 
                        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,IP1)!=NULL && strstr(Session2_ip1,port1)!=NULL) {n=0;} 
                     if(strstr(Session3_ip1,IP1)!=NULL && strstr(Session4_ip1,port1)!=NULL) {n=1;} 
        } 
     
    } 
fclose(file); 
}
hat jemand eine ideee wie man das programmieren kann. ?
 
Ich würde nicht nur auf das erste zeichen gucken sondern immer die Komplette Reihe überprüfen und zwar mit strcmp(). Dann bräuchtest du noch eine "Liste" in der Alle bereits geschirebenen Zeilen gespeichert werden.
1. Zeile einlesen
2. Zeile gegen die "Liste" testen
2. a Zeile bereits vorhanden => Weiter mi 1. Schrit
2. b Zeile nich Vorhanden => Weiter mit 3. Schritt
3. Zeile der Liste hinzufügen
4. Zeile in die "ouput"-Datei schreiben
5. Zurück zum 1. Schritt
 
Mit Liste kann alles gmeint sein.
Es könnte ein Array sein so:char* list[500];
Problem wär nur, das man maximal 500 Zeilen auslesen kann, man köntne natürlich anfangen das mit einem Doppel pointer zu machen char** list;
dann kann man dem Array eine "Dynamische" Größe zuordnen.
Wenn man auf die STL (c++) zurück greifen will. könnte man auch vector<char*> benutzen.
 
Zurück