Problem mit Array
-
Hallo,
ich lese eine Datei.txt ein:
Hans Wall;Alexstr. 1;10101 Berlin; //Kunde
Äpfel;5;1,99; // Artikel;kg;PreisWie 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.