Probleme mit Dateizugriffen



  • Moin zusammen,
    ich habe von euch vor längerem schon mal einen Vorschlag bekommen, wie ich aus cvs-Dateien Daten extrahieren kann. Ich habe einen Wert als Integer vorgegeben, und die zugehörigen Daten aus der Zeile ausgeprintet. (Ich gebe Artikelnummer ein, und bekomme Preis, Bezeichnung usw.) wieder raus.
    Jetzt habe ich längere Artikelnummern, sodass ein Integer nicht mehr geht. Ich habe Strings genommen. Aber jetzt funktioniert es nicht richtig. Es wird immer nur der erste Wert aus der Datei gelesen. Wenn der nicht mit der Artikelnummer übereinstimmt, wird die nächste Zeile NICHT gescannt. Warum? Kann jemand helfen? Gerne Kann die Funktion auch "umgestrickt" werden.

    int readrow(FILE *fp, char column_a[20], char *column_b, double *column_c)
    {
        int c;
    
        int found;
    	int n;
    
    	int test;
    
        /*Erste zeile ueberlesen*/
    
        c = fgetc(fp);
        while(c!='\n' && c !=EOF)
        	c = fgetc(fp);
    
        rc = 0;
        found = 0;
    	test=0;
    
        while(!found && c!=EOF)
        {   
    
    		/*Wert aus Spalte A einlesen*/
    
            fscanf(fp,"%[^;]", i);
    
    		printf("i: %s\n", i);
    		printf("a: %s\n", column_a);
    
            /*Wert aus Spalte A mit a vergleichen*/
    
    		for (n=0; n<20; n++)
    			{
    
    				if (i[n] != column_a[n])
    					{
    						printf("Ungleichheit\n");
    						/*fals nicht gleich zur naechten Zeile Springen*/
    						c = fgetc(fp);
    					    while(c!='\n' && c !=EOF)
    							c = fgetc(fp);
    						test=1;
    					}
    
    			}
    
    		if(test==1)
    			{
    				fscanf(fp,"%[^;]", i);
    				printf("i: %s\n", i);
    			}
    
    		if (test==0)
    			{
    				printf("Gleichheit\n");
    				rc = 1;
    		       	/*falls doch beiden anderen werte einlesen;*/       
    				fgetc(fp); /*;-lesen*/
    				rc += fscanf(fp, "%[^;]", column_b);
    
    				fgetc(fp); /*;-lesen*/
    				rc += fscanf(fp, "%lf", column_c);
    				found = 1;
    			}		
    
        }
        return rc;
    }
    

    Achso, was genau macht eigentlich

    c = fgetc(fp);
        while(c!='\n' && c !=EOF)
            c = fgetc(fp);
    

    Beste Abendliche Grüße
    (und Danke schon mal) 😉



  • hilo schrieb:

    Achso, was genau macht eigentlich

    c = fgetc(fp);
        while(c!='\n' && c !=EOF)
            c = fgetc(fp);
    

    Beste Abendliche Grüße
    (und Danke schon mal) 😉

    Netter Einfall, bei der Ausgangsfrage, gerade noch diese Frage zu stellen :).
    (was für ein deutsch, ein glück, dass kein semikolon drin war :))

    Nun ja, int fgetc(FILE *fp)
    liest ein Zeichen von dem Eingabe-Stream, auf den
    fp verweist. Der Return-Wert ist das gelesene Zeichen oder EOF, wenn ein
    Fehler auftrat ;).
    Zeilenweise lesen:
    char *fgets(char *buf, int n, FILE *fp)
    liest vom Eingabe-Stream, auf den
    fp verweist, bis zu n-1 Zeichen in den mit buf angegebenen Puffer und hängt
    ein Null-Zeichen an. Das Lesen wird beim Erreichen eines Zeilenendes oder des
    Dateiendes beendet. Ein gelesenes Newline-Zeichen '\n' bleibt erhalten, d. h.,
    es wird im Puffer gespeichert. Der Return-Wert ist entweder buf oder NULL, wenn
    ein Fehler auftrat.
    Oder
    Blocks lesen:
    size_t fread(void *buffer, size_t size, size_t n, FILE *fp)
    liest bis zu n Objekte der Größe size aus dem durch fp adressierten Stream
    und schreibt sie in den Vektor, auf den dessen Anfang buffer zeigt. Der Return-Wert ist die Anzahl der gelesenen Objekte.



  • ha, und was muss ich machen, damit mein programm läuft?
    Wenn es mit integern geht, muss es doch auch mit strings möglich sein...



  • strcmp()



  • Ja, das wäre eine gute Möglichkeit.
    Dann müsste ich einen String-Arry nicht zeichenweise vergleichen wie bei

    for (n=0;n<10;n++)
        {
            if (arry1[n] == arry2[n]
                {
                    ...
    

    aber das Problem ist ja, dass ich nicht weiss, wie ich in die nächste Zeile springe. Wie das bei mir aussieht, hast du ja oben gesehen...

    String;Int;Double;Int
    stringnummereins001;123;0.325;1
    stringnummerzwei002;234;0.795;2
    stringnummerdrei004;567;0.985;3
    stringnummervier005;789;0.515;4
    

    Also, ich öffnen die Datei und suche in der ersten "Spalte" (??? iste es eine???) nach "stringnummerdrei004". rauskommen soll dann "567" , "0.985" und "3"

    😉



  • omfg, wo bin ich hier nur gelandet...

    also du machst folgendes:
    zeilenweise lesen mit fgets
    zeilen zerhacken mit sscanf

    dann hast du die wahl...
    entweder: das zerhackte irgendwo inn speicher packen und dann filtern
    oder: gleich beim lesen filtern

    sag mal, belegst du keinen kurs, wo du programmieren lernst? wenn du ein gutes buch ueber programmierung (wie z.b. k&r C oder sicp) liest, werden eigentlich alle deine probleme geloest.

    davon mal abgesehen, dir steht die komplette befehlsreferenz von ansi c zur verfuegung. schmoeker da drin und such mal selber nach ner loesung. wie soll das denn nur weitergehen, wenn du nie ohne hilfe ans ziel kommst?

    jaja, anfaenger brauchen hilfe. das is mir klar. dann such dir aber auch nicht so grosse ziele aus, sondern geh in kleinen schritten vor.


Anmelden zum Antworten