Problem mit Array



  • Hallo,

    ich lese eine Datei.txt ein:
    Hans Wall;Alexstr. 1;10101 Berlin; //Kunde
    Äpfel;5;1,99; // Artikel;kg;Preis

    Wie kann ich jetzt den Gesamtpreis berechnen 5*1,99 berechnen?

    Mit dem Einlesen habe ich kein Problem, jedoch weiß ich nicht wie es jetzt weitergehen soll. Wie ich daraus ein array mache und die Datentypen einstelle,
    da
    Hans Wall;Alexstr. 1;10101 Berlin; //Kunde
    alles char.
    Hier
    Äpfel;5;1,99; // Artikel;kg;Preis
    char;int;float



  • Hi,
    du kannst dich Zeichen für Zeichen durch die Datei hangeln und an der richtigen Position die Werte direkt mit scanf einlesen.

    Gruß,
    B.B.



  • danzriba schrieb:

    Wie kann ich jetzt den Gesamtpreis berechnen 5*1,99 berechnen?

    du musst aus dem komma einen punkt machen (haste bestimmt schon, wenn's als float gespeichert ist) und dann einfach: float gesamt = kg * preis;
    🙂



  • @BigBrother

    Danke erstmal für die Antwort.
    Könntest du mir ein Beispiel geben wie das funktioniert? Wie ich da anfangen soll?



  • Wie liest du denn ein bisher?



  • FILE* in = fopen("Rechnungsdaten00.txt", "r");
             if (in == NULL)
             {
                 printf("Eingabedatei \"%s\" konnte nicht geöffnet werden!\n", "Rechnungsdaten00.txt"); 
                     return EXIT_FAILURE ;
             } ;   
             char dieZeile[256] = { '\0' };
             do
             {
                 fgets(dieZeile, 255, in);
    	       printf("%s", dieZeile);
             }   while(dieZeile[0] != ';');
             fclose(in);
    


  • Deine Abbruchbedingung müsstest du nochmal überdenken.
    Das Programm würde bei einem leeren Element in der Datei enden:
    ;Äpfel;1.23;22
    die Äpfel würden nicht gelesen werden.

    Dann wertest du jede Zeile separat aus und konvertierst die Daten:

    #include <stdio.h> 
    #include <string.h>
    #include <errno.h>
    #include <locale.h>
    
    #define SEPARATOR ';' 
    #define BACKSLASH '\\' 
    #define COMMA ','
    
    #define SIZE 256
    
    int eret ( char* e ) 
    { 
        if (e) perror(e); 
        else printf("%s\n", strerror(errno)); 
    } 
    
    void convert_line ( char* s )
    {
    	char buf[SIZE] = {0};
    	int i = 0;
    	while (*s) // Bis zum Ende der Zeile durchlaufen.
    	{
    		if ( *s == BACKSLASH ){/*Eventuell Escapesequenzen konvertieren.*/}
    		if ( *s == COMMA ){/*Eventuell Komma konvertieren.*/}
    
    		if ( *s == SEPARATOR )  
    		{
    			if ( buf[0] )
    			{
    				// Hier Zahlen konvertieren (strtod, strtoul, etc).
    				printf ( "%s\n", buf ); // Wenn etwas im Puffer ist, anzeigen.
    				memset ( buf, 0, sizeof ( buf )); // Puffer leeren.
    
    			}
    			i = 0;
    			s++;
    			continue; // Das Trennzeichen wird nicht im Puffer gespeichert.
    		}
    		buf[i++] = *s++; // Ein Zeichen in den Puffer kopieren.
    	}
    }
    
    int main() 
    { 
        char* fname = "test.txt"; 
    	char line[SIZE] = {0};
    
        FILE* fp = fopen (fname, "rb"); 
        if ( fp == NULL ) return eret (fname); 
    
    	setlocale(LC_ALL,"German"); // Umlaute anzeigen.
    
        while ( fgets ( line, sizeof(line), fp ))
        { 
    		convert_line(line);
    	}
        if (ferror(fp))
    	    perror(fname);
    
    	fclose(fp); 
    	return 0; 
    }
    

    Die Zahlen kannst du aus dem Puffer mit den Funktionen strtod, strtoul etc. konvertiern.
    Bedenke auch, das jeder Datensatz, d.h. jede Zeile maximal SIZE-1 Zeichen haben darf.

    Gruß,
    B.B.



  • Das müsste noch hinter die while Schleife in die Konvertierungsfunktion:

    if (i)
    {	 // Die Daten hinter dem letzten Semikolon.
    	 puts(buf);
    }
    


  • Vielen Dank für deine Hilfe, werde es heute weiter probieren 🙂



  • danzriba schrieb:

    FILE* in = fopen("Rechnungsdaten00.txt", "r");
             if (in == NULL) // recht umständlich
    

    Variante für Tippfaule wie mich:

    if (!in)
    

    tut genauso.


Anmelden zum Antworten