Datei durchsuchen
-
Hallo, also ich hab folgendes Problem:
Ich hab eine *.txt datei.
Die sieht zB so aus:
Max Meier - 123456 - Bla blub str 5
Jürgen bla - 123456 - Teststr 5 - BerlinAlso nicht in jeder Zeile sind die gleichen angaben.
Nun soll das Programm nach bestimmten Strings suchen, zB
"Max Meier"
"Berlin"usw.
Die können auch erstmal fest im Programm stehen.Und die Zeile wo die strings auftauchen sollen ganz gelöscht werden.
Und die anderen verbleibenden Infortmationen in einer neuen Textdatei abgespeiert werden.Ich weiß aber nciht genau wie ich das angehen soll das er die ganze zeile einliest, einen teil da raus sucht und die ganz zeile löscht.
Die Zeilen sehen auch nicht immer gleich aus. Bei einigen sind mehr informationen bei anderen weniger.
Ich wäre sehr dankabr für denkansätze, tipps usw.
-
Oder was auch ginge. Vielleicht leicher wäre (?)
Das er die Zeile nach einem Sting druchsucht und diese in eine Datei kopiert.
-
Wie wär's mit:
#include <stdlib.h> #include <stdio.h> #include <string.h> size_t find( char *src, char *value, size_t begin = 0 ) { size_t pos = begin; size_t value_length = strlen( value ); size_t src_length = strlen( src ); for( size_t i = pos; i <= ( src_length - value_length ); ++i ) { if( strncmp( src + i, value, value_length ) == 0 ) { return i + 1; } } return 0; } void delete_line_from_pos( char **src, size_t pos ) { size_t start, end; size_t src_length = strlen( *src ); char *tmp; for( start = pos; ( start > 0 ) && ( ( *src )[ start ] != '\n' ); --start ); for( end = pos + 1; ( ( *src )[ end ] != '\0' ) && ( ( *src )[ end ] != '\n' ); ++end ); tmp = ( char* ) malloc( src_length - ( end - start ) + 1 ); memcpy( tmp, *src , start ); memcpy( tmp + start, ( *src ) + end, src_length + 1 - end ); free( *src ); *src = tmp; } int main( ) { char file_name[ ] = "C:\\test.txt"; char value_to_find[ ] = "Wien"; long file_length = 0; size_t find_result = 0; FILE *file = fopen( file_name, "rt" ); if( !file ) { printf( "File \"%s\" could not be opened!\n", file_name ); return EXIT_FAILURE; } fseek( file, 0, SEEK_END ); file_length = ftell( file ); fseek( file, 0, SEEK_SET ); char *text = ( char* ) malloc( file_length ); if( !text ) { fclose( file ); printf( "Not enough memory!\n" ); return EXIT_FAILURE; } fread( text, 1, file_length, file ); text[ file_length - 2 ] = '\0'; printf( "\"%s\" countains: \n%s\n\n", file_name, text ); if( ( find_result = find( text, value_to_find ) ) ) { printf( "\"%s\" has been found at position %i in \"%s\".\n\n", value_to_find, find_result, file_name ); delete_line_from_pos( &text, find_result - 1 ); printf( "The line containing \"%s\" has been removed:\n%s\n\n", value_to_find, text ); fclose( file ); file = fopen( file_name, "w+t" ); fwrite( text, 1, strlen( text ), file ); } else { printf( "\"%s\" could not be found in \"%s\"!\n\n", value_to_find, file_name ); } fclose( file ); }
BTW:
Net_Ghost02 schrieb:
Die Zeilen sehen auch nicht immer gleich aus. Bei einigen sind mehr informationen bei anderen weniger.
Und in welcher Weise stört uns das!?
Greetz, Swordfish
-
tmp = ( char* ) malloc( src_length - ( end - start ) + 1 );
ansi c !!
-
Sobald mir jemand einen C-Compiler schenkt schreib' ich ANSI-konformen Code
Greetz, Swordfish
-
Swordfish schrieb:
Sobald mir jemand einen C-Compiler schenkt schreib' ich ANSI-konformen Code
Greetz, Swordfish
gcc -std=c89 -c datei.c
oder
gcc -std=c99 -c datei.c
-
gcc mag ich nicht
Greetz, Swordfish
-
Dankeschön!
Klappt.
Muss es nur noch in ne Schleife reinpacken damit er alle doppelten durchsucht und löscht :> bis keine mehr da sind...
-
dir ist schon aufgefallen, dass du
size_t find( char *src, char *value, size_t begin = 0 ) { size_t pos = begin; size_t value_length = strlen( value ); size_t src_length = strlen( src ); for( size_t i = pos; i <= ( src_length - value_length ); ++i ) { if( strncmp( src + i, value, value_length ) == 0 ) { return i + 1; } } return 0; }
mit einem Wert für begin aufrufen kannst? Was hältst du davon, für begin das Ergebnis des letzten find( ) zu nehmen!?
Greetz, Swordfish
-
Ahh,.. ja, geht auch ^^
hätt jetzt einfach die zeilen zählen lassen und in ne for schleife gepackt...
*G*
-
Hallo Allerseits!
Ich habe folgendes Problem: ich muss aus verschieden files Daten herauspicken um dann mit ihnen zu rechnen, leider bin ich programmiertechnisch ein NULL.
Habe mir erlaubt, die Suchroutine von Swordfish zu leihen, aber das mit dem einlesen kriege ich immer noch nicht hin. Da Daten stehen in den files so:
...
name
0: 12.3445
1: 123.00
2: 3...
Hilfe?!
-
Frosch schrieb:
...
name
0: 12.3445
1: 123.00
2: 3...
Hilfe?!
Ein bischen genauer beschreiben wie die Datei aussieht und was genau
du machen willst, wäre hilfreich!
-
Oh, ok, sorry.
Die Dateien haben alle das Schema
name_des_wertes
0: wert0
1: wert1
...
13: wert13name_des_naechsten_wertes
0: wert0name_
0: wert0
1: wert1usw.
Ich muss jeweils den Wert suchen anhand des Namens und dann 'wertx' einlesen und auf einem array (?) speichern um dann damit zu rechnen.Dank dem Programm von oben finde ich jetzt auch den jeweiligen Namen, aber dann weiss ich nicht, wie ich von da an "bewege", also in die nächste Zeile und dann dieses '0:' überspringe, denn ich brauche ja nur den Wert. Wie viele Werte ich da stehen habe hängt auch von einer in dieser Weise eingelesen Variablen ab.
Danke schon mal!
-
fscanf