Textdatei auslesen und eine andere Textdatei schreiben?



  • Da war noch was...

    C schrieb:

    ...Die strtok Aufrufe kannst du mit einer Zeile sprintf ersetzen, macht das ganze kürzer und leserlich....

    Du meinst bestimmt sscanf.
    Guckst du hier:

    char* xxx = "E 192.168.0.84 5996 192.168.0.221 5890 0 user0 user1";
    void check_this_out()
    {
    	char AoE[8], ip1[64], ip2[64], port1[32], port2[32],
    	 codec[64], name1[64], name2[64];
    	sscanf ( xxx, "%s %s %s %s %s %s %s %s", AoE, ip1, ip2, port1, port2, codec, name1, name2 );
    	puts ( ip1 ); // usw..
    }
    


  • Big Brother Schrieb!

    Hast du Email ? Dann schick ich dir mal was.
    Wenn du willst, kopiere ich das auch hier rein.

    du kannst das auch hier rein kopieren..Danke



  • Ok, hier hast du nen Filter, der dir die Paare rausholt. Kannst du dir ja umschreiben oder so.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MAXLINELEN 256 
    #define ANFANG 'A'
    #define ENDE 'E'
    
    void error_exit ( char* e )
    {
    	fcloseall ();
    	fprintf ( stderr, "%s\n", e );
    	exit (1);
    }
    
    int haveA ( char* A, char* file ) // Gibt es die A Zeile in der Datei 'file' ?
    {
    	FILE* fp = fopen ( file, "rt" );
    	char buf [MAXLINELEN];
    
    	if ( fp == NULL )
    		return 0; // Datei existiert( noch ) nicht, also auch nicht die Zeile.
    
    	while ( NULL != ( fgets ( buf, sizeof ( buf ), fp )))
    	{
    		if ( 0 != ferror ( fp ))
    			error_exit ( "fgets failed. " );
    
    		if ( 0 == strcmp ( A, buf ))
    		{
    			 if ( fclose ( fp ) )
    				error_exit ( "fclose failed. " );
    
    			return 1; // Zeile gefunden.
    		}
    	}
    
    	if ( fclose ( fp ) )
    		error_exit ( "fclose failed. " ); 
    
    	return 0; // Zeile nicht gefunden.
    }
    
    void addAB ( char* A, char* B, char* file ) // AE Paar zur Datei hinzufügen.
    {
    	FILE *fp = fopen ( file, "a+t" );
    
    	if ( NULL == fp ) 
    		error_exit ( "fopen failed. " );
    
    	fputs ( A, fp );
    	if ( ferror ( fp ) )
    		error_exit ( "fputs failed. " );
    
    	fputs ( B, fp );
    	if ( ferror ( fp ) )
    		error_exit ( "fputs failed. " );
    
    	if ( fclose ( fp ) )
    		error_exit ( "fclose failed. " );
    
    	return;
    }
    
    void uniquePairs ( char *Data, char* Result )
    {
    	char A [MAXLINELEN], B [MAXLINELEN];
    	FILE* fData;
    	fpos_t pos;
    
    	if ( NULL == ( fData = fopen ( Data, "rt" )))
    		error_exit ( "fopen failed. " );
    
    	while ( NULL != ( fgets ( A, sizeof ( A ), fData )))
    	{
    		if ( 0 != ferror ( fData ) )
    			error_exit ( "fgets failed. " );
    
    		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. " );
    		}
    	}
    }
    
    int main()
    {
    	char *Data = "verkehrsdaten.txt";
    	char *Result = "feld.txt";
    
    	uniquePairs ( Data, Result );
    
    	return 0;
    }
    

    Gutes Gelingen.
    Gruß,
    B.B.



  • vielen Dank Big Brother ich werde es am Montag auspropieren..da es bei mir zu Hause nicht möglich ist.
    ich sage dir dann Bescheid, wenn soweit ist..
    Danke noch mal



  • Hallo Big Brother;
    habe das mit dem programm heute versucht was zu machen aber leider gibt mir keine fehler und erzeugt die datei feld nicht..weiss nicht wo das problem ist..



  • Keine Fehlermeldung, keine feld.txt ?
    Na, irgend etwas muss doch passieren. 😕



  • bis jetzt immer noch nicht wie gesagt die textdatei feld wird auch nicht ergeuzt.??? 😕



  • Von hier kann ich da auch nix machen. Schreib doch ein kleines Programm, das dir die verkehrsdaten.txt einliest und wieder ausgibt, dann hast du einen Ansatz und kannst ergänzen.



  • die textdatei feld wird jetzt erzeugt , aber nichts reingeschrieben also die bleibt leer??



  • Vielleicht gibt keine 'E' Zeile, die zu einer 'A' Zeile gehört, denn es werden nur Paare rausgefiltert.
    Habe es bei mir probeweise laufen lassen und es hat funktioniert.

    Ansonsten musst du dich mit einem Debugger vertraut machen, oder Zwischenausgaben einbauen und dir anzeigen lassen.



  • müssen die 'A' und 'E' zeile (paarweise) in der textdatei Verkehrsdaten in Reihenfolge kommen oder wie ?



  • azoul schrieb:

    müssen die 'A' und 'E' zeile (paarweise) in der textdatei Verkehrsdaten in Reihenfolge kommen oder wie ?

    Nö, die E-Zeile muss irgendwo unterhalb der A-Zeile auftauchen. Falls sie oberhalb gefunden werden soll, musst du den Dateizeiger an den Anfang setzen.



  • hallo B.B.
    das Programm springt nie in dieser if Anweisung rein?

    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. 
                    }
    

    weisst du wo das problem liegt?



  • azoul schrieb:

    hallo B.B.
    das Programm springt nie in dieser if Anweisung rein?
    ...
    weisst du wo das problem liegt?

    Das ist gut möglich, das hängt von deiner Datei verkehrsdaten.txt ab.
    Angenommen, dort gibt es eine Zeile, die so aussieht:
    A 192.168.0.84 5996 192.168.0.221 5890 0 user0 usera

    Und irgendwo weiter unten gibt es eine Zeile, die so aussieht:
    E 192.168.0.84 5996 192.168.0.221 5890 0 user0 usera

    Dann springt das Programm da auch rein. Sobald sich die Zeile aber mehr als nur um den einen Buchstaben, das 'E' unterscheidet, wird dort auch nicht reingehüpft.



  • die datei verkehrsdaten sieht so aus: z.B

    A 192.168.0.84 6500 192.168.0.221 6380 0 user user1
    A 192.168.0.84 6500 192.168.0.221 6380 0 user user1
    A 192.168.0.84 6500 192.168.0.221 6380 0 user user1
    E 192.168.0.84 6500 192.168.0.221 6380 user user1
    A 192.168.0.123 5062 192.168.0.121 10014 8 user3 user4
    A 192.168.0.84 6502 192.168.0.221 6382 0 user user1
    A 192.168.0.84 6502 192.168.0.221 6382 0 user user1
    A 192.168.0.84 6502 192.168.0.221 6382 0 user user1
    E 192.168.0.84 6502 192.168.0.221 6382 user user1
    E 192.168.0.123 5062 192.168.0.121 10014 user3 user4
    

    warum funktioniert dann nicht, obwohl die E Zeile immer nach A Zeile kommt??



  • Weil in deinen E-Zeilen die Codec-Nummern fehlen.



  • das habe ich auch vermutet muss damit morgen versuchen.



  • 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.


Anmelden zum Antworten