Programm gibt 2. Zeile aus der eingelesenen Datei nicht aus?
-
Datei Rechnungsdaten sieht so aus:
Ernestine Musterfrau;Gebirgsallee 8a;14534 Bergdorf/Franken;Gehaeuse;102.24;1;
Netzteil;55.24;1;
Mainbord;45.24;1;
CPU;61.24;2;
Kuehler;19.99;2;
RAM;42.34;4;
Grafikkarte;101.24;1;
Tastatur;10.00;1;
Maus;11.11;1;
Festplatten;89.22;3;
;
Das Programm dazu:
zuerst werden die Kundendaten eingelesen, danach wird die 2. Zeile übersprungen.
Ab der dritten wird gerechnet. Warum nimmt er die 2. Zeile nicht?/* ============================================================================ Programm zur Berechnung und Ausgabe einer Rechnung ============================================================================ */ /** @author Daniel * @version 1.0 * Datum: 15.12.2009 * */ /** Das Programm besteht aus den folgenden Funktionen: toGermanDate, ausgabeInhaber, printPreis, zerlegen, zerlegenPreis, zaehleSemikolon und main. */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> /**Funktion zur Ausgabe der in Deutschland üblichen Schreibweise des Datums */ void toGermanDate(char date[], char gdate[]) { gdate[0] = date[8] ; gdate[1] = date[9] ; gdate[2] = ' ' ; gdate[3] = date[4] ; gdate[4] = date[5] ; gdate[5] = date[6] ; gdate[6] = ' ' ; gdate[7] = date[20] ; gdate[8] = date[21] ; gdate[9] = date[22] ; gdate[10] = date[23] ; gdate[11] = '\0' ; } /**Funktion gibt Sterne auf dem Bildschirm aus */ void ausgabeSterne(void) { printf("********************************************************\n") ; } /**Funktion gibt eine Leerzeile auf dem Bildschirm aus */ void ausgabeLeerzeile(void) { printf("* *\n") ; } /**Funktion gibt den Namen der Firma auf dem Bildschirm aus */ void ausgabeFirma(char firma[]) { printf("* %s *\n", firma) ; } /**Funktion gibt den Namen des Inhabers auf dem Bildschirm aus */ void ausgabeName(char name[]) { printf("* %s *\n", name) ; } /**Funktion gibt die Strasse in der sich die Firma befindet auf dem Bildschirm aus */ void ausgabeStrasse(char strasse[]) { printf("* %s *\n", strasse) ; } /**Funktion gibt die PLZ und den Ort in dem sich die Firma befindet auf dem Bildschirm aus */ void ausgabePLZOrt(char plz[], char ort[]) { printf("* %s %s *\n", plz, ort) ; } /** Die Funktion gibt den Rechnungskopf aus, d.h. der Name der Firma wird ausgegeben, der Name des Inhabers, die Adresse und PLZ */ void ausgabeInhaber(char firma[], char name[], char strasse[], char plz[], char ort[]) { ausgabeSterne() ; ausgabeLeerzeile() ; ausgabeFirma(firma) ; ausgabeLeerzeile() ; ausgabeName(name) ; ausgabeLeerzeile() ; ausgabeStrasse(strasse) ; ausgabeLeerzeile() ; ausgabePLZOrt(plz, ort) ; ausgabeLeerzeile() ; ausgabeSterne() ; } /** Funktion berechnet den Betrag, den der Kunde für die gekaufte Artikelart zu welchem Preis des Preises und der Anzahl aus und gibt die Gesamtsumme zurück */ void printPreis( float preis, float anzahl ) { float summe = anzahl * preis; printf("Ausgabe der Zeilensumme: %6.2f Euro\n\n",summe); } /** Die Funktion zerlegt die 1. Zeile, in der sich die Kundendaten befinden, in einzelne Werte. Es wird zeichenweise eingelesen. Als erstes wird der artikel eingelesen, bis ein Semikolon auftritt. Dann wird die strasse eingelesen, bis ein Semikolon auftritt. Als letztes wird der ort eingelesen, bis ein Semikolon auftritt. */ void zerlegen(char in[], char name[], int nameLength, char strasse[], int strasseLength, char ort[], int ortLength) { int inIndex = 0 ; int outIndex = 0 ; char c = in[inIndex] ; // while (c != ';') { name[outIndex] = c ; outIndex++ ; inIndex++ ; c = in[inIndex] ; } ; name[outIndex] = '\0' ; outIndex = 0 ; inIndex++ ; c = in[inIndex] ; while (c != ';') { strasse[outIndex] = c ; outIndex++ ; inIndex++ ; c = in[inIndex] ; } ; strasse[outIndex] = '\0' ; outIndex = 0 ; inIndex++ ; c = in[inIndex] ; while (c != ';') { ort[outIndex] = c ; outIndex++ ; inIndex++ ; c = in[inIndex] ; } ; ort[outIndex] = '\0' ; } /** Die Funktion zerlegt ab der 2.ten Zeile, die Zeile in einzelne Werte. Es wird zeichenweise eingelesen. Als erstes wird der artikel eingelesen, bis ein Semikolon auftritt. Dann wird der preis eingelesen, bis ein Semikolon auftritt. Als letztes wird die anzahl eingelesen, bis ein Semikolon auftritt. */ void zerlegenPreis(char in[], char artikel[], int artikelLength, char preis[], int preisLength, char anzahl[], int anzahlLength) { int inIndex = 0 ; int outIndex = 0 ; char c = in[inIndex] ; while (c != ';') { artikel[outIndex] = c ; outIndex++ ; inIndex++ ; c = in[inIndex] ; } ; artikel[outIndex] = '\0' ; outIndex = 0 ; inIndex++ ; c = in[inIndex] ; while (c != ';') { preis[outIndex] = c ; outIndex++ ; inIndex++ ; c = in[inIndex] ; } ; preis[outIndex] = '\0' ; outIndex = 0 ; inIndex++ ; c = in[inIndex] ; while (c != ';') { anzahl[outIndex] = c ; outIndex++ ; inIndex++ ; c = in[inIndex] ; } ; anzahl[outIndex] = '\0' ; } /** Die Funktion überprüft die Eingabe auf Semikolons, und zählt wieviele in einer Zeile sind. Dabei überprüft die for-Schleife jedes einzelne Zeichen in der Zeile auf Semikolon. Wenn ein Semikolon vorhanden ist, dann wird die Variable retval eins hochgezählt. Die Integervariable, retval wird mit sprintf in einen String formatiert. */ void zaehleSemikolon( char eingabe[256] , char exist[] ) { int retval = 0; // Rückgabewert int i = 0; // Laufvariable for ( i = 0; i <= strlen( eingabe ); i++ ) { if ( eingabe[i] == ';' ) { retval++ ; } } sprintf( exist, "%d", retval ); } /** Die main-Funktion: Zuerst wird das Datum ausgegeben, danach werden ine einem aus Sternen konstruierten Kastendie Firmendaten ausgegeben. Daraufhin wird geprüft, ob die aufgerufene Datei "Rechnungsdaten0.txt existiert. Falls nein, wird eine Fehlermeldung ausgegeben, dass die Datei nicht geöffnet werden kann. Falls ja, werden die Daten aus der Datei zeilenweise eingelesen, in 3 Teile zerlegt und ausgegeben. Zuerst wird die 1. Zeile eingelesen, die die Daten des Rechnungsnehmers enthaelt. Ab der 2. Zeile werden die für die Berechnung der Rechnung nötigen Daten eingelesen, in drei Teile zerlegt und ausgegeben. Dabei wird vorher immer in einer Schleife überprüft, wieviele Semikolons in der Zeile vorhanden sind. Wenn es 1 Zeichen ist oder weniger, dann wird die Schleife abgebrochen.Für jede Zeile wird eine Zwischensumme berechnet. Und zum Schluss werden die Zwischensummen addiert und die Gesamtsumme ausgegeben. */ int main(int argl, char* args[]) { { time_t now = time(NULL) ; char tmp[32] = {'\0'} ; char* dieZeit = tmp ; dieZeit = ctime(&now) ; char germanDate[12] = {'\0'} ; char convertedDate[12] = {'\0'} ; toGermanDate(dieZeit, germanDate) ; struct tm* stime = localtime(&now) ; strftime(convertedDate, 12, "%d.%m.%Y", stime); //schreibe in das feld converteddate , max 12 stellen, d=tag, m=monat, y=jahr, variablenname stime printf("\nRechnungsdatum: %s\n\n", convertedDate) ; } { ausgabeInhaber("Kostenlose Software AG", "Linus Torvalds", "Charlottenstr. 41", "10117", "Berlin") ; } char eingabe[256] ; char name[64] ; char strasse[64] ; char ort[64] ; char artikel[64] ; char preis[64] ; char anzahl[64] ; char exist[20]; int retval = 0; float gesamtsumme = 0.0; FILE* in = fopen("Rechnungsdaten0.txt", "r") ; if (in == NULL) { printf("Die Datei %s konnte nicht geoeffnet werden!\n", args[1]) ; exit(EXIT_FAILURE) ; } ; // Erste Zeile Kundendaten: fgets(eingabe, 255, in) ; zerlegen(eingabe, name, 63, strasse, 63, ort, 63) ; fgets(eingabe, 255, in) ; printf("Kundendaten:\n"); printf("Name: %s\n", name) ; printf("Strasse: %s\n", strasse) ; printf("Ort: %s\n", ort) ; // Schleife liest aus, bis nur ein ";" Zeichen dort ist while ( fgets(eingabe, 255, in) ) { zaehleSemikolon( eingabe, exist ); retval = atoi( exist ); if ( retval <=1 ) { continue; } // wenn die Anzahl der Semikolons gleich 1 oder kleiner 1 ist, wird die Schleife abgebrochen. zerlegenPreis(eingabe, artikel, 63, preis, 63, anzahl, 63) ; printf("Artikelbezeichnung: %s\n", artikel) ; printf("Preis: %s Euro\n", preis) ; printf("Anzahl: %s\n", anzahl) ; printPreis( atof(preis), atof(anzahl) ); gesamtsumme = gesamtsumme + ( atof(preis) * atof(anzahl) ); } // Drucken der Gesamtsumme: printf("Die Gesamtsumme betraegt: %6.2f Euro\n", gesamtsumme); fclose(in) ; return EXIT_SUCCESS ; }
-
Da sieht keiner durch. Anstatt 500+ Zeilen zu posten solltest du eine Spezialversion für das Forum machen und alles aus deinem Programm löschen was nichts mit dem Problem zu tun hat. Dann kommst du auf etwa 10 bis höchstens 30 Zeilen und dann können wir dir auch helfen.
Ändere dein void zaehleSemikolon( char eingabe[256] , char exist[] ) in int zaehleSemikolon(char *eingabe); und anstatt den Rückgabewert in einen String zu printen schreibe return retval;.
Außerdem überlege dir ob du wirklich so unglaublich viele Leerzeichen und Leerzeilen brauchst.
-
Fehler gefunden