Datei speichern und einlesen
-
hallo zusammen.
zuerst: ich bin neu hier und muss C programmieren, wovon ich 1% ahnung habe.meine aufgabe:
wir haben einen automaten gebastelt der was einnimmt.
nun sollen die einnahmen gespeichert werden in einer datei.
bei einem neustart des programms sollen die einnahmen übernommen werden, also eingelesen werden.wie zum teufel mach ich das?
hat jemand vielleicht einen ansatz?
ohne den bin ich verlorendanke schonmal!
mfgwas wir als hilfe haben:
Dateien: Einlesen oder Ausgeben
// ¨Offnen von Dateien
FILE *fopen(char *Dateiname, char *Modus );
// Schließen von Dateien
int fclose(FILE *Datei);
// Schreiben in Dateien
int fprintf(FILE *Datei, const char *format [, argument ]... );
// lesen aus Dateien
int fscanf(char *buffer, const char *format [, argument ] ...);
// Beispiele:
FILE *in; // Pointer auf Struktur vom Typ FILE
FILE *out;
int x;
// ¨offnet eine Datei zum lesen
in=fopen("dateiname","r");
fscanf(in,"%i",&x);
// ¨offnet eine leere Datei zum Schreiben
// Gibt es die Datei schon, so wird sie ¨uberschrieben.
out=fopen("dateiname","w");
fprintf(out,"hallo Welt"); // in die Datei schreiben
// ¨offnet eine Datei zum Schreiben,
// wenn die Datei schon existiert, werden Daten am Ende angeh¨angt.
out=fopen("dateiname","a");
// Schließen der Dateien
fclose(in);
fclose(out);ich weiss aber absolut nicht wie ich das jetzt programmieren kann -.-
-
Na gut, ein Ansatz:
Programmstart Datei mit Name xxx öffnen -> Fehler: Abbruch und Meldung ausgeben -> Datei Zeile für Zeile in ein string-Array einlesen bis EOF erreicht Verarbeitung der Daten - was immer du machen musst -> Fehler: Abbruch und Meldung ausgeben -> Array Zeile für Zeile in Datei schreiben Programmende
-
danke für die schnelle antwort.
ich habe was gebastelt, was mehrere stunden gedauert hat.jetzt ist ein kleines programm entstanden, was funktioniert!
es erstellt sogar eine datei, in der die einnahmen von 40DM gespeichert werden.das einzige problem ist jetzt:
wo ist der fehler, warum er die datei nicht korrekt aufruft und immer nur "-1" angezeigt wird, wo nur??bitte nicht aufregen über die schei* formatierung ^^
#include <stdio.h>
int main (void)
{
int i, j;
int auswahl_1;
int stor=1;
int auswahl_5;float einzahlung=0, fehlenderbetrag=0,MWST=0,ENDBETRAG=0,uberpreis=0,unterpreis=0,preis_1;
// DATEIEN---------------------------------------------------------------------------
FILE *in,*out;
int x[1000];
int Anzahl;
float erg=0;//DATEI LESEN-------------------------------------------------------------------------
in=fopen("farp","r");
fscanf(in,"%i",&x);
fclose(in);do {
erg=fscanf(in,"%i",&x[i]);
i++;
} while(erg!=EOF&&erg!=0);
Anzahl=i-1;
fclose(in);
printf("%5.2f",erg);while(stor == 1)
{
//-------------------------------------------------------------------------------------printf("\n\n\nWohin willst du fliegen?\n");
printf("Waehle die 1 fuer Mallorca, \n");
printf("Auswahl: ");
scanf("%d", &auswahl_1);if(auswahl_1 == 1){preis_1=40; printf("Das kostet: %3.2f DM\n\n", preis_1);}
if(auswahl_1 == 2){preis_1=21; printf("Das kostet: %3.2f DM\n\n", preis_1);}
if(auswahl_1 == 3){}
if (auswahl_5==1)
{
preis_1=0;
stor=1;
}
else{
stor=0;printf("Bitte bezahle jetzt : \n");
scanf("%f",&einzahlung);if (einzahlung>preis_1){
uberpreis=einzahlung-preis_1;
printf("Rest: %5.2f\n\n",uberpreis);
einzahlung=preis_1;
}else { printf("Danke");}
}
}//DATEI SCHREIBEN------------------------------------------------------------------
char preis[80];
sprintf(preis,"%i",preis_1);
out=fopen("farp","w");
fprintf(out,"%f",preis);
fclose(out);
//------------------------------------------------------------------------------}
-
Detlef schrieb:
bitte nicht aufregen über die schei* formatierung ^^
Mach' ich nicht, keine Angst. Lesen werde ich das aber auch nicht.
<a href= schrieb:
RTFM! oder warum dir keiner helfen will...">- [cpp]-Tags verwenden.
-
So funktioniert fscanf nicht.
Lies dir nochmal durch, welchen Wert fscanf zurückgibt und welche man übergibt.
Z.B. da: http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/Was soll das
fscanf(in,"%i",&x); // Was steht in der Datei? Und warum das &? fclose(in);
Nach dem fclose() kannst du nicht mehr aus dem stream (hier das in) lesen.
Detlef schrieb:
bitte nicht aufregen über die schei* formatierung ^^
Dadurch ist es aber auch schei* zu lesen.
Abhilfe: Code markieren und den C/C++ Button unter denanklicken
-
Keine Zeit das jetzt zu korrigieren, aber ich lass mal Autoformat drüber laufen...
#include <stdio.h> int main (void) { int i, j; int auswahl_1; int stor=1; int auswahl_5; float einzahlung=0, fehlenderbetrag=0,MWST=0,ENDBETRAG=0,uberpreis=0,unterpreis=0,preis_1; // DATEIEN--------------------------------------------------------------------------- FILE *in,*out; int x[1000]; int Anzahl; float erg=0; //DATEI LESEN------------------------------------------------------------------------- in=fopen("farp","r"); fscanf(in,"%i",&x); fclose(in); do { erg=fscanf(in,"%i",&x[i]); i++; } while(erg!=EOF&&erg!=0); Anzahl=i-1; fclose(in); printf("%5.2f",erg); while(stor == 1) { //------------------------------------------------------------------------------------- printf("\n\n\nWohin willst du fliegen?\n"); printf("Waehle die 1 fuer Mallorca, \n"); printf("Auswahl: "); scanf("%d", &auswahl_1); if(auswahl_1 == 1){preis_1=40; printf("Das kostet: %3.2f DM\n\n", preis_1);} if(auswahl_1 == 2){preis_1=21; printf("Das kostet: %3.2f DM\n\n", preis_1);} if(auswahl_1 == 3){ } if (auswahl_5==1) { preis_1=0; stor=1; } else{ stor=0; printf("Bitte bezahle jetzt : \n"); scanf("%f",&einzahlung); if (einzahlung>preis_1){ uberpreis=einzahlung-preis_1; printf("Rest: %5.2f\n\n",uberpreis); einzahlung=preis_1; } else { printf("Danke");} } } //DATEI SCHREIBEN------------------------------------------------------------------ char preis[80]; sprintf(preis,"%i",preis_1); out=fopen("farp","w"); fprintf(out,"%f",preis); fclose(out); //------------------------------------------------------------------------------ }
-
Thuruk schrieb:
Keine Zeit das jetzt zu korrigieren, aber ich lass mal Autoformat drüber laufen...
#include <stdio.h> int main (void) { int i, j; int auswahl_1; int stor=1; int auswahl_5; float einzahlung=0, fehlenderbetrag=0,MWST=0,ENDBETRAG=0,uberpreis=0,unterpreis=0,preis_1; // DATEIEN--------------------------------------------------------------------------- FILE *in,*out; int x[1000]; int Anzahl; float erg=0; //DATEI LESEN------------------------------------------------------------------------- in=fopen("farp","r"); fscanf(in,"%i",&x); fclose(in); do { erg=fscanf(in,"%i",&x[i]); i++; } while(erg!=EOF&&erg!=0); Anzahl=i-1; fclose(in); printf("%5.2f",erg); while(stor == 1) { //------------------------------------------------------------------------------------- printf("\n\n\nWohin willst du fliegen?\n"); printf("Waehle die 1 fuer Mallorca, \n"); printf("Auswahl: "); scanf("%d", &auswahl_1); if(auswahl_1 == 1){preis_1=40; printf("Das kostet: %3.2f DM\n\n", preis_1);} if(auswahl_1 == 2){preis_1=21; printf("Das kostet: %3.2f DM\n\n", preis_1);} if(auswahl_1 == 3){ } if (auswahl_5==1) { preis_1=0; stor=1; } else{ stor=0; printf("Bitte bezahle jetzt : \n"); scanf("%f",&einzahlung); if (einzahlung>preis_1){ uberpreis=einzahlung-preis_1; printf("Rest: %5.2f\n\n",uberpreis); einzahlung=preis_1; } else { printf("Danke");} } } //DATEI SCHREIBEN------------------------------------------------------------------ char preis[80]; sprintf(preis,"%i",preis_1); out=fopen("farp","w"); fprintf(out,"%f",preis); fclose(out); //------------------------------------------------------------------------------ }
Was mir auf die Schnelle aufgefallen ist:
1. In Zeile 21 wird die Datei geschloßen aber in Zeile 24 noch munter daraus gelesen.
2. In Zeile 68 benutzt Du als Format %i übergibst aber einen Float.
3. In Zeile 70 benutzt Du als Format %f übergibst aber einen char*.
4. In Zeile 69 erzeugst Du eine neue Datei statt die Daten an die bestehende Datei anzuhängen.
5. Warum machst Du das so umsändlich über das char array? Den Preis kannst Du direkt mit fprintf ausgeben.
6. Beim Öffnen einer Datei mußt Du IMMER den Erfolg prüfen.
7. Die Währung DM gibt es schon lange nicht mehr.
8. Bin mir jetzt nicht mehr sicher aber in ANSI-C ist die Deklaration von Variablen mitten im Block nicht erlaubt. Das kann nur C++. Zeile 67 müsste daher Dein Compiler monieren.mfg Martin
-
mgaeckler schrieb:
8. Bin mir jetzt nicht mehr sicher aber in ANSI-C ist die Deklaration von Variablen mitten im Block nicht erlaubt. Das kann nur C++. Zeile 67 müsste daher Dein Compiler monieren.
Seit C99 (also seit über 10 Jahren) geht das auch in C.
Aber bei Microsoft-Compilern halt nicht, denn die unterstützen nur C89.