Auswahl eines Datensatzes
-
Moin!
Also ich habe volgendes Problem. In meinem Programm schreiben ich Daten in eine Datei ein und gebe diese komplet aus. Jetzt soll ich auch einen bestimmten Datensatz ausgeben, indem ich den Name eingebe. Ich bekomme es hin den ersten Datensatz zu bekommen, wenn ich Name1 eingebe.
Kann mir jemand helfen?
Hier kommt mein Quellcode:
#include <stdio.h> #include <stdlib.h> #include <string.h> FILE *getrecord(); char m_read_Data[50]; char m_Name[50]; char m_verg_Name[50]; void main ( void ) { FILE *datei; struct datensatz { char Name[50]; char Nr[50]; char PLZ[50]; }structur[4] = {{"Name1","10","11111"}, {"Name2","20","22222"}, {"Name3","30","33333"}, {"Name4","40","44444"}}; datei = fopen ( "test.dat" , "w+" ); if (datei == NULL ) { printf ("\nFehler: Die Datei konnte nicht geöffnet werden!\n"); } else { // Write data into file fprintf (datei, "Name = %s Nr= %s PLZ = %s \n", structur[0].Name, structur[0].Nr, structur[0].PLZ); fprintf (datei, "Name = %s Nr= %s PLZ = %s \n", structur[1].Name, structur[1].Nr, structur[1].PLZ); fprintf (datei, "Name = %s Nr= %s PLZ = %s \n", structur[2].Name, structur[2].Nr, structur[2].PLZ); fprintf (datei, "Name = %s Nr= %s PLZ = %s \n", structur[3].Name, structur[3].Nr, structur[3].PLZ); // Read data rewind(datei); //Dateizeiger an den Dateianfang positionieen fscanf(datei," Name = %s Nr = %s PLZ = %s",structur[0].Name, structur[0].Nr, structur[0].PLZ); fscanf(datei," Name = %s Nr = %s PLZ = %s",structur[1].Name, structur[1].Nr, structur[1].PLZ); fscanf(datei," Name = %s Nr = %s PLZ = %s",structur[2].Name, structur[2].Nr, structur[2].PLZ); fscanf(datei," Name = %s Nr = %s PLZ = %s",structur[3].Name, structur[3].Nr, structur[3].PLZ); // Outout record printf ("Nachname: %s Str-Nr: %s PLZ: %s \n", structur[0].Name, structur[0].Nr, structur[0].PLZ); printf ("Nachname: %s Str-Nr: %s PLZ: %s \n", structur[1].Name, structur[1].Nr, structur[1].PLZ); printf ("Nachname: %s Str-Nr: %s PLZ: %s \n", structur[2].Name, structur[2].Nr, structur[2].PLZ); printf ("Nachname: %s Str-Nr: %s PLZ: %s \n", structur[3].Name, structur[3].Nr, structur[3].PLZ); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// // Bestimmten Datensatz auslesen printf ("Bitte geben Sie den Namen vom Gewuenschten Datensatz ein:\n"); scanf("%s", &m_Name); rewind(datei); fscanf(datei,"Name = %s", structur[0].Name); // Sind beide Arrays gleich if(memcmp(structur[0].Name, m_Name, sizeof(structur[0].Name)) == 0 ) { printf ("Datensatz lautet: %s Str-Nr: %s PLZ: %s\n", structur[0].Name, structur[0].Nr, structur[0].PLZ); } else { printf ("Der Name war nicht korrekt\n"); } fclose (datei); } }
-
hi !
du kannst die namen in einer schleife abfragen.
-
fwrite und fread bietet eine möglichkeit mehrere strukturen in einem rutsch zu
lesen/schreiben
wenn du mit deiner methode mehrere hundert namen lesen/schreiben willst, dann mal viel spass beim tippen.mal so als anregung:
#include <stdio.h> struct datensatz { char Name[50+1]; unsigned Nr; char PLZ[5+1]; }daten[4] = { {"Name1", 1, "11111"}, {"Name2", 2, "22222"}, {"Name3", 3, "33333"}, {"Name4", 4, "44444"} }; int speichern( int n, char* fname ) { FILE* fp; if ( (fp = fopen( fname, "w")) == NULL ) { fprintf( stderr, "Can't open file." ); return 1; } if( n != fwrite( daten, sizeof(struct datensatz), n, fp ) ) { fprintf( stderr, "Failed on fwrite." ); fclose(fp); return 1; } fclose(fp); return 0; } int name_suchen( char *fname, int n, char* name ) { FILE* fp; int i = 0; if ( (fp = fopen( fname, "r")) == NULL ) { fprintf( stderr, "Can't open file." ); return 1; } if( n != fread( daten, sizeof(struct datensatz), n, fp ) ) { fprintf( stderr, "Failed on fread." ); fclose(fp); return 1; } fclose(fp); for ( i = 0; i < n; i++ ) { if ( strcmp( daten[i].Name, name ) == 0 ) { printf("%s gefunden.\n", name ); return 0; } } printf( "%s nicht gefunden.\n" ); return 1; } int main(void) { int n = 4; char path[256+1]; if ( speichern( n, "test.dat" ) ) return 1; printf("%d Datensaetze gespeichert %s\n" , n, getcwd(path, sizeof(path)-1) ); name_suchen ( "test.dat", n, "Name3" ); name_suchen ("test.dat", n, "RUMPELSTILZCHEN" ); getchar(); return 0; }