[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 Datei

    Ein 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


Anmelden zum Antworten