Problem beim Abspeichern in Datei
-
SeppJ schrieb:
Zusätzlich zu dem was DirkB gesagt hat:
Beim binären Schreiben, schreibst du immer den gleichen Wert. Weißt du uberhaupt, was der dritte Parameter von fwrite macht?Anzahl beim Lesen: Zähl doch mit!
Endung anfügen: Da hatte ich die Aufgabenstellung nicht gelesen. Ein Zusammenfügen von Zeichenketten war gar nicht gefragt. Die Ersetzung sollte so an sich ok sein. Aber der Parameter der Funktion stimmt überhaupt nicht. Merh Sorgfalt beim Programmieren und weniger Copy&Paste!
Und damit dir alles klarer wird, versuch mal ein Hauptprogramm mit den Funktionen zu schreiben, egal ob sie schon vollständig funktionieren oder nicht. Fehler kannst du mit dieser Aufteilung recht gut isolieren und aufspüren.
Nun dieser gibt die Anzahl der zu schreibende Elemente an:
unsigned int binaeres_lesen(double* array, FILE *datei) { int anz; int zaehler = 0; if(datei != NULL) { while(!feof(datei)) { anz = fread(array,sizeof(double), 1, datei); if(anz == 0) { break; } zaehler++; } return zaehler; } }
Müsste doch eigentlich so passen, da ja bis zum Dateiende durchlaufen wird.
Auch hier habe ich wieder Schwierigkeiten, denn welche Parameter würden sonst in Frage kommen? Aber an diesem Beispiel sieht man perfekt, dass es mir einfach schwer fehlt einzelne Aufgaben miteinander zu verknüpfen.
Das Programm ist fertig (ich habe nur die einzelnen Fkt. gepostet), jedoch erhalte ich jedesmal ein Debug Assertion Failed. Anscheinend funktioniert in Zeile 54 (bei mir) ein fopen nicht, komischerweise befindet sich in dieser Zeile aber keines.
-
Woher sollen wir wissen in welcher deiner Quelltextfassungen der Fehler in Zeile 54 angezeigt wird. Es kann auch sein das die Ursache für die Fehlermeldung ein paar Zeilen früher liegt.
Und, wenn noch ein Fehler auf Grund des Quelltextes angezeigt wird ist ein Programm noch nicht fertig
-
DirkB schrieb:
fread() gibt die Anzahl der gelesenen Zeichen/Bytes zurück.
Das ist falsch.
fread gibt die Anzahl der erfolgreich gelesenen Blöcke (von Zeichen/Bytes/...) zurück.
-
MichaelE schrieb:
Aber an diesem Beispiel sieht man perfekt, dass es mir einfach schwer fehlt einzelne Aufgaben miteinander zu verknüpfen.
Wenn es dir trotz vieler Versuche immer noch so schwer fällt, zu abstrahieren und dir einen "globaleren" Überblick über dein Programm zu verschaffen, solltest du vielleicht mal nach einem anderen Job Ausschau halten.
SeppJ schrieb:
Und damit dir alles klarer wird, versuch mal ein Hauptprogramm mit den Funktionen zu schreiben, egal ob sie schon vollständig funktionieren oder nicht. Fehler kannst du mit dieser Aufteilung recht gut isolieren und aufspüren.
Übersichtlicher (und damit einfacher zu begreifen, auch noch nach längerer Zeit) ist es, Funktionalitäten zu separieren und in Funktionen zu kapseln. Auch die Fehlersuche wird dann viel einfacher, da du die Funktion in der der Fehler auftritt, einfacher ermitteln kannst. Sowas nennt man auch Top-Down Entwurf, also z.B.
int main() { int anzahl; char *datei = "bla.bin"; char *zieldatei[FILENAME_MAX]; fehlerbehandlung( datei ); ermittleZieldateiname( zieldatei, datei ); anzahl = kopiere( datei, zieldatei ); printf("%d Werte wurden kopiert.",anzahl ); return 0; } void fehlerbehandlung( const char *name ) { /* hier dann konkret implementieren */ } ... void ermittleZieldateiname( char *zname, const char *name ) { /* hier dann konkret implementieren */ } ...
-
DirkB schrieb:
was falsches über fread()
Ups.
Danke für die Richtigstellung.
-
Zur Ergänzung: Programm funktioniert nun endlich so wie es soll
-
Bei diesem Programm bekomme ich einen Zugriffsverletzung beim Schreiben, wenn ich das Programm starte, jedoch kann ich den FEhler nicht ausfindig machen..
typedef struct { char name[31]; int alter; }Person; int main() { FILE *pRead; FILE *pSave; int anzahl = 0; Person per; pRead = fopen("Struktur.txt", "r"); pSave = fopen("PERSONEN1.BIN", "wb"); if(pRead == NULL) { printf("Fehler"); return 0; } if(pSave == NULL) { printf("Fehler"); return 0; } while(!feof(pRead)) { fscanf(pRead, "%s", per.name); fscanf(pRead, "%d", per.alter); fwrite(&per.name, sizeof(per.name), 1, pSave); fwrite(&per.alter, sizeof(per.alter), 1, pSave); anzahl++; } printf("Anzahl: %d", anzahl); fclose(pRead); fclose(pSave);
-
Es macht doch immer wieder Freude, wenn man sieht, dass drei Seiten gut gemeinter Hilfe zu sichtbaren Verbesserungen und Erfolgen führen [/ironie]
Zum Fehler: Compilier mal mit Warnungen. So wie du es immer tun solltest.
-
DirkB * schrieb:
Nebenbei ist name doch schon ein Zeiger. Da darfst du dann keinen Adressoperator (&) mehr nehmen
* Sinngemäß am 18:26:01 06.09.2011
-
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/
Durchlesen und schauen was du anders in deinen Quelltexten machst