[c]Datei Durchsuchen/Ausgeben
-
Okay mit dem habe ich jetzt nicht gerechnet..
Nun möchte ich aber ja das wenn ich die Nummer oder Name eintippe/scanne auch der richtige Datenzatz mit den Infos angezeigt wird.
Ich habe dazu im i-net was gestöbert und bin auch diese Funktion hier gestoßen: strcmp() mit der man Strings vergleichen kann. Leider weiß ich nicht ob man das damit umsetzen kann?Wo sind denn die Daten gespeichert in einer Struktur? Möchtest du die Struktur füllen, durchsuchen, leeren usw.?
Mit strcmp() ginge das z.B. so:
if(!strcmp(s_KundenData.nachname, "Hugo")) printf("Passt.");
-
Die Daten sind in einer .txt Datei gespeicher
12345,hopf,große gaße 3,00000,entenhausen,03341235609,5,0,0,0,0 23456,maier,hauptstr. 12a,12000,darkcity,0223486745,1,0,0,0,0 99999,hans,gartenweg 23,00000,entenhausen,03341235490,0,0,0,0,0
"die , sollten eigendlich ; sein
habe ich noch nicht geändert."
So weit ich weis braucht man immer eine Struktur sobald man was mit Daten aus einer Datei machen möchte, und die ist ja auch vorhanden:
struct s_Kunden { int nummer; char nachname[30+1]; char strasse[30+1]; char ort[25+1]; int plz; int tele; char rabat[5]; char flag1[1]; char flag2[1]; char flag3[1]; char flag4[1]; }s_KundenData;
Ich drucke das jetzt mal so aus wie ich denke das man das am besten verstehen kann
Ich möchte eigendlich nur das wenn ich eine Nummer oder den Namen Eintippe/Scanne mir aus der kunden.txt der richtige kunde herausgesucht wird und mit den Infos Nummer Name Tele Adresse Rabt angezeigt wird.Deswegen dachte ich das man einfach nur den eigetippten/eingescannten Strig mit dem aus der Kunden.txt vergleichen müsste.
mfg
opener
-
Dazu liest du einfach eine Zeile aus der TXT-Datei in die Struktur ein und vergleichst dann den eingegebenen String mit dem aus der Struktur. Wenn die Übereinstimmung negativ ist, nächste Zeile einlesen und wieder vergleichen. Das sollte sich relativ einfach mit einer Schleife lösen lassen.
-
Du sagst das so leicht, wenn das so einfach für mich wäre breuchte ich keine 2 Tage dafür
Ich habe keine ahnung von C und habe wie schon im ersten Post geschrieben gerade die Ausbildung angefangen. Leider kann hier in der Firma keiner C und so haben sie mir das einfach mal in die Schuhe geschoben
Also noch mal zum Code:
while(c != EOF) { c = fgetc(ptr_Datei); if(c == ';') // printf("Hier beginnt, bzw. endet (je nachdem wie man's siehst) eine spalte\n"); if(c == '\n') printf("Hier ist die Zeile zu ende und mit dem naechsten Zeichen beginnt die naechste Zeile\n"); } rewind(ptr_Datei); // setzt den filepointer (ptr_Datei) wieder auf den anfang der datei while(c != EOF) { c = fgetc(ptr_Datei); if(c == ';') { // printf("Hier endet die spalte\n"); mein_string[i] = '\0'; //ein string sollte immer mit dem zeichen '\0' abgeschlossen werden printf(mein_string); break; //verlässt die while-Schleife } else { mein_string[i] = c; i++; } }
Hier wird doch die Zeile eingelesen?! oder sehe ich das Falsch?
aber wie kann man den die zeile aus der txt in die Struktur laden?
EDIT: Kann mir vieleicht jemand sagen wo ich in dem Code der oben gepostet ist dann die "strcmp()" Funktion einbauen muss? damit die strings verglichen werden?
mfg
opener
-
Hallo nochmal
ich habe nun noch eine andere möglichkeit die etwas einfacher ist ;):
char line[LINE_SIZE]; char* delim = ","; char* word = NULL; int i = 0; while(fgets(line, LINE_SIZE, ptr_Datei) != NULL){ word = strtok(line, delim); for(i = 0; word != NULL; i++){ if(i == 0){ printf("%s\n", word); break; } word = strtok(NULL, delim); } } fclose(ptr_Datei); return 0;
Leider kann ich diesen nicht Compillieren da ich immer den C2062 Error erhalte.
Ich arbeite mit dem Windowscompiler in der Eingabeauforderung. (Version 8.00).Irgent wie wird bei mir die Mircosoft Seite wo steht wie man das behaben kann http://support.microsoft.com/default.aspx?scid=kb%3Bde%3B113118 nicht richtig angezeigt...(es ist kein text zu sehen )
Wäre super wenn mir jemand sagen könnte was ich machen muss damit ich das Compillieren kann.
-
google doch mal nach '2062'
Die Zeileninhalt, wo der Fehler auftritt, wäre auch sehr aufschlußreich. Müsste etwas mit einer struct class oder type(def) sein.
Hier hab ich stricmp eingebaut.
char line[LINE_SIZE]; char* delim = ","; char* word = NULL; int i = 0; int stop = 0; while(fgets(line, LINE_SIZE, ptr_Datei) != NULL) { word = strtok(line, delim); for (i = 0; word != NULL && i < 2; i++) { if (i == 0) { printf("%s\n", word); break; } else if (i == 1) { if (stricmp(word, "mueller-luedenscheid") == 0) { printf("Nr. %s\n", line); stop = 1; break; } } word = strtok(NULL, delim); } if (stop) break; } fclose(ptr_Datei); return 0;
-
Hallo opener,
Ich war mal so frei, eine Funktion zu entwerfen, mit der Du in deiner Datei beispielsweise nach den Namen suchen kannst.
Rückgabewert der Funktion:
1 = gefunden
0 = nicht gefunden
-1 = fehler beim öffnen der DateiEin Wort zur Fehlerbehandlung.
Die ist nur rudimentär: (bei atoi prüfen ob es Zahl ist besser strtod Funktion verwenden)Nichts desto trotz kann dass vielleicht als Ansatz helfen...
int FindeKunde(s_Kunden* Kunde, char* Name) { // Deklarationen FILE* f = NULL; // Filepointer int zeichenZaehler = 0; // Zählt die Zeichen für eine String int strukturZaehler = 0; // Navigation in der Struktur char zeichen; // aktuelles Zeichen char aktuellerString[30 + 1]; // Hält den aktuellen String (30 + 1 weil // der größte String maximal 30+1 lang ist) // Datei öffnen (hier aktuellen Pfad der Datei mitberücksichtigen) f = fopen("Datei.txt", "r"); // lesender Zugriff if(!f) { printf("Unable to open file!\n"); return -1; } //Solange nicht das Ende der Datei erreicht ist while(!feof(f)) { //Lies ein Zeichen zeichen = fgetc(f); // Bei komma haben wir ein Element fertig if(zeichen == ',') { aktuellerString[zeichenZaehler] = '\0'; zeichenZaehler = 0; //Kopieren der Daten in die Struktur switch(strukturZaehler) { case 0: //Nummer Kunde->nummer = atoi(aktuellerString); strukturZaehler++; break; case 1: //Name strcpy(Kunde->nachname, aktuellerString); strukturZaehler++; break; case 3: //Strasse strcpy(Kunde->strasse, aktuellerString); strukturZaehler++; break; case 4: //PLZ Kunde->plz = atoi(aktuellerString); strukturZaehler++; break; case 5: //Ort strcpy(Kunde->ort, aktuellerString); strukturZaehler++; break; case 6: //Telefon Kunde->tele = atoi(aktuellerString); strukturZaehler++; break; case 7: //ab hier Rabatt und Flags strcpy(Kunde->rabat, aktuellerString); strukturZaehler++; break; case 8: Kunde->flag1 = zeichen; strukturZaehler++; break; case 9: Kunde->flag2 = zeichen; strukturZaehler++; break; case 10: Kunde->flag3 = zeichen; strukturZaehler++; break; case 11: Kunde->flag4 = zeichen; strukturZaehler++; break; } } // Ein neuer Datensatz beginnt (evtl. Kombinationen '\n\r' berücksichtigen) else if(zeichen == '\n') { strukturZaehler = 0; zeichenZaehler = 0; if(strcmp(Kunde->nachname, Name) == 0) return 1; //hier muss evtl. noch die Struktur gelöscht werden } // Einfach nur String erweitern else { aktuellerString[zeichenZaehler] = zeichen; ++zeichenZaehler; } } //Falls letzter Datensatz nicht mit '\n' abgeschlossen ist if(strcmp(Kunde->nachname, Name) == 0) return 1; fclose(f); return 0; }
Der Aufruf funktioniert so:
int main(void) { s_Kunden gesuchterKunde; if(FindeKunde(&gesuchterKunde, "blablabla") == 1) printf("%d, %s", gesuchterKunde.nummer, gesuchterKunde.nachname); else printf("Nicht gefunden!\n"); getchar(); return 0; }
-
Ich hab' jetzt nicht alles gelesen (zu müde), aber was haltet ihr von fscanf( )?
Greetz, Swordfish
-
Jupp, wäre natürlich auch ne Möglichkeit...
Gruss
Tobi
-
die wohl IMNSHO die eleganteste für solche Zwcke in reinem C
Greetz, Swordfish