-
27.01.12 15:14 #1
- Registriert seit
- Jun 2011
- Beiträge
- 76
Hi zusammen,
ich habe hier ein Bsp-Programm das zeigt das erstellen einer .dat datei und dann mit fwrite das irgendwie binär in die datei ".dat" schreibt.
1. Was bedeutet der format ".dat"?
2. Was bringt es überhaupt Werte binär in ein file schreiben in meinem Fall?
3. Wenn ich die .dat nach dem compilieren mit Hilfe des Notpad++ öffne, dann steht da:
)NUL NUL NUL#HNUL NUL usw. Was bedeutet das? Das ist doch kein Binär.
4. fwrite() wandelt alle Zahlen auf den der Pointer actVal bzw. arrayValues zeigt in Binär um, oder wie funktioniert das genau?
Hier das Programm:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
//1. c-file(main) #include <stdio.h> #include <stdlib.h> #include "compl.h" #define MAX_STRLEN 20 void main() { char filename[MAX_STRLEN]="daten.dat"; int file_len = 20; FILE *outFile=NULL; complex* arrayValues=NULL; complex* actVal = NULL; int n=0; arrayValues=malloc(sizeof(complex)*file_len); if (arrayValues != NULL) { actVal=arrayValues; for(n=0; n<file_len; n++) { actVal->real=rand(); actVal->imag=rand(); c_print(*actVal); actVal++; } actVal=arrayValues; outFile=fopen(filename,"wb"); // wb = write binary siehe buch if (outFile != NULL) { if (file_len != fwrite(arrayValues,sizeof(complex),file_len,outFile)) { printf("error during write of %d blocks!\n",file_len); } fclose(outFile); } else { printf("cannot write file %s!",filename); } free(arrayValues); } } //2. c-file: #include "compl.h" #include <stdio.h> void c_print(complex a) { printf("%d + j%d\n",a.real,a.imag); } //h-file: struct complex_struct { int real; int imag; }; typedef struct complex_struct complex; void c_print(complex a);
Gruß
Googlehupf
-
27.01.12 15:33 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Nichts. Es ist eine beliebige Endung. "DATA"
Was ist denn dein Fall?
Alles auf dem Computer ist binär.
Der Editor zeigt aber natürlich Zeichen an und keine Bits.
fwrite wandelt gar nichts um. Die Daten werden so wie sie im Speicher stehen in die Datei geschrieben, Byte für Byte.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Nix weiter. Dateiendungen sind nur Kosmetik und ich nehme an, man wollte damit ausdrücken, dass es sich um rohe DATen handelt. ".dat"
Du kannst Sie mit fread einfach wieder einlesen. Du schreibst die Daten roh raus und ließt sie roh ein. Man muss sich keine Gedanken über irgendwelche Standards (xml etc.) machen.
Wieso ist das kein Binär? Notepad++ zeigt dir freundlicherweise auch \0 Bytes an, anstatt sie unsichtbar zu lassen. Denn im Zeichensatz gibt es dafür kein Zeichen. Es gibt außerdem kein nicht-Binär.
Für jedes Byte wird ein Byte in die Datei geschrieben. Wenn du z.B. einen double Wert mit 64 Bit hast werden 8 Byte in die datei geschrieben, genau in der Reihenfolge, wie Sie im Speichern liegen. Mehr dazu hier http://en.wikipedia.org/wiki/IEEE_75...#Basic_formats und für das Beispiel hier http://en.wikipedia.org/wiki/Double_...rmat:_binary64 (siehe Bild)
-
27.01.12 15:46 #4
- Registriert seit
- Jun 2011
- Beiträge
- 76
Ich soll ein Übungsprogramm schreiben das so in etwa aussehen soll:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Kurzbeschreibung : Programm zum Ueben von dynamischer Speicherverwaltung,[B]binaeren FileIO.[/B] Implementierung zum Test von malloc free Ueben von modularem Programmieren und ueben von Strukturen mit Pointern. Entwerfen Sie ein Modul zur Verwaltung von Terminen. Ein Termin muss folgendes enthalten: Thema von (Datum + Uhrzeit als Typ) bis (Datum + Uhrzeit als Typ) Teilnehmer Prioritaet (HOCH, MITTEL, NIEDRIG) Beschreibung Status (ERLEDIGT, OFFEN) Schreiben sie ein kleines Menue zum Verwalten der Termine. Folgende Punkte muessen enthalten sein: Eingabe, Ausgabe eines Termines oder der gesamten Liste. Loeschen und Anfuegen von Terminen. Die Termine sollen in einem Binaerfile gespeichert werden. Termine sollen geloescht werden koennen und als erledigt markiert werden koennen.
Ja in diesem Fall muss ich binäres File io üben, aber was hat das mit Termindaten zu tun? Ich soll also ein Menü schreiben zum Verwalten der Termine etc.
Die Termine sollen in ein Binärfile gespeichert werden. Ja und mit "wb" schreibe ich binär in ein file korrekt?
Ich weis halt nicht wie ich da anfangen könnte, ich schätze mal vieles mit scanf zum Eingeben der Termine, Priorität etc.
Aber wie gesagt ich weiß gar nicht wie ich da Anfangen soll
.
Kann mir da wer weiterhelfen bitte?
-
27.01.12 15:55 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Es ist ein Übungsprogramm. Irgendwie muss man die Daten ja speichern. Es soll kein Textformat sein, sondern ein binäres Format.
Nicht ganz. Die Datei wird im Binärmodus (im Gegensatz zum Textmodus) geöffnet. D.h. einfach nur, dass keine Übersetzung von \n in \r\n und zurück unter Windows gemacht wird. Ansonsten gibt's keinen Unterschied.
Das eigentlich "binäre" Schreiben geschieht mit fwrite (im Gegensatz zu fprintf, welches Text schreibt).
Ja, Benutzerinterface, Daten abfragen usw.
Dann Datenhaltung, speichern von Terminen usw.
Eine Struktur für einen Termin wäre ein guter Anfang.
Dann versuch diese Struktur (bzw. mehrere davon) in eine Datei zu schreiben.
Dann wieder auslesen.
Damit bist du schonmal für's Wochenende beschäftigt...
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
28.01.12 15:06 #6
- Registriert seit
- Jun 2011
- Beiträge
- 76
Ok, danke.
Aber klingt doch irgendwie einfach... alles mit Hilfe von scanf in eine Struktur reinlesen und die struktur dann in ein .dat file mit fwrite reinschreiben oder?
Sicher das das nicht komplezierter ist oder täuscht das?
Bzw. was ist mit Unterprogramme/Funktionen - Wo soll man den die hier nutzen.
Bis jetzt habe ich immer ein Unterprogramm/Funktion gebraucht, wenn ich was berechne oder so.
Aber hier habe ich keine blassen schimmer? Die ganze einlesungen in die Struktur vielleicht?
Und was ist mit Modulen - Wie viele C- und h-files?
Bis jetzt hab ich es immer so gemacht: 1 c-file für Hauptprogramm, 1 c-file fürs auslesen eines files(unterprogramm) und 1 c-file für die rechnungen(unterprogramm) und 2 h-files die jeweils zu den 2 c-files mit Unterprogrammen gehören.
Kann mir wer bitte mehr Tipps geben
?
-
Ja, sicher..
Statt die ganzen einzelnen Teile der Struktur einzeln mit fprintf/fscanf
in die Datei zu schreiben/daraus zu lesen braucht man für die ganze struct
nur ein fwrite/fread.
Ein "Nachteil" ist dann eben, dass die Datei nicht wirklich lesbar ist.
Falls das sein muss gehts mit den Funktionen nicht, ist ja aber nicht gefragt.
Gibt noch einige potenzielle Probleme, die hier aber nicht auftreten werden.
Betrifft vor allem Compiler-/Plattformwechsel.
Und zur Funktions-/Dateiaufteilung:
Wenn das ganze Programm nicht mehr macht als einlesen/speichern/laden
würd ich mir das gar nicht überlegen, sondern einfach alles ins main...
Wenn man unbedingt will, eben das Einlesen von der Tastatur.
struct im main per Pointer übergeben und in der Funktion befüllen.
Andere Aufteilungen verkomplizieren das nur unnötig.
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
28.01.12 20:21 #8
- Registriert seit
- Jun 2011
- Beiträge
- 76
Danke dir!
Welcher Sinn steckt den dahinter bei dieser Übung? Was soll/kann ich mit dem Binär fall oder im demfall mit dem verschiedenen Zeichen(1 Zeichen = 1 Byte) die in der .dat datei stehn machen?
-
Wieder auslesen?
Tieferen Sinn gibts bei einer Übung wohl nicht...Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
28.01.12 23:04 #10
Ich habe das mit strukturen gemacht. Sry wenn er das auch gemacht hat habe es nur überflogen
Also ich speicher so immer meine "SaveGames" vom Spiel. Also Position, Blickrichtung, Objekte, Lebensenergie, usw. Das ist einfacherer als alles in einzelnen Werten reinzuschreiben
Fehlermeldung bitte!
Google - Dein Freund und Helfer
-
29.01.12 10:00 #11
- Registriert seit
- Jun 2011
- Beiträge
- 76
Danke!
Ahja, und in diesem Ordner wo die Angabe(uebung.c) ist, ist noch eine Datei drinnen...
"._uebung.c"(<--- ist sozusagen transparent) heißt die und wenn ich diese öffne, dann erscheinen komische Zeichen(✠œ ). Da steht irgendwas mit apple drinnen macOx textcoding apple.com etc.
.
Der Lehrer hat auch einen Mac-Laptop. Ist die Datei wichtig für die Übung?
-
Hellsehen können wir nicht, aber ich sag mal nein.
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
29.01.12 14:26 #13
Also mit Transparent meinst du vll Unsichtbar? Also guck mal ob die Datei noch da ist wenn du deine IDE wieder schliesßt. Vll ist es nur eine Auslagerungsdatei.
Fehlermeldung bitte!
Google - Dein Freund und Helfer
-
29.01.12 14:38 #14
- Registriert seit
- Jun 2011
- Beiträge
- 76
Ist noch immer da, aber glaub ist egal... Habs einfach vom Projekt ausgeschlossen.
Auf jedenfall hab ich jetzt angefangen diese Übung zu programmieren und es treten Fehler auf, die ich nicht finden kann:
Also, mein Problem:
Wenn ich das ganze mit scanf mache dann geschieht folgendes beim "Starten ohne Debugging": Ich kann och die anzahl der Termine eingeben und auch noch das Thema aber dann kommt: "'name des programms'.exe funktioniert nicht mehr".
Wenn ich das ganze mit gets mache dann geschieht folgendes beim "Starten ohne Debugging": Hier kann ich auch noch die Anzahl eingeben aber dann kommt:siehe Bild
Jetzt mal abgesehn von den Fehlern passt es den in etwa so wie ich es programmiert habe?
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
1. c-file(main): #include "write_termin.h" #include "w_binaer_file.h" #include <stdio.h> void main() { char filename[MAX_LEN]="daten.dat"; terminData* daten=NULL; int anz=0; printf("Geben Sie bitte die Anzahl Ihrer Termine ein:"); scanf("%d",&anz); daten=write_termin(filename,anz); write_binaer_file(filename,daten,anz); free(daten); } 2. c-file: #include "write_termin.h" #include <stdio.h> terminData* write_termin(char filename[], int anz) { terminData* daten=NULL; terminData* daten1=NULL; int n=0; daten=(terminData*)malloc(sizeof(terminData)* anz); if(daten != NULL) { daten=daten1; while(n<anz) { printf("Thema des Termins:\n"); scanf("%s",&daten1->topic); //gets(daten1->topic); printf("Anfangsdatum des Termins:\n"); scanf("%s",&daten1->start_date); //gets(daten1->start_date); printf("Enddatum des Termins:\n"); scanf("%s",&daten1->end_date); //gets(daten1->end_date); printf("Wer nimmt teil?\n"); scanf("%s",&daten1->user); //gets(daten1->user); printf("Priorität des Termins(HOCH, MITTEL, NIEDRIG:\n"); scanf("%s",&daten1->priorität); //gets(daten1->priorität); printf("Beschreibung des Termins:\n"); scanf("%s",&daten1->description); //gets(daten1->description); printf("Status des Termins(ERLEDIGT, OFFEN):\n"); scanf("%s",&daten1->start_date); //gets(daten1->start_date); n++; daten1++; } } else { printf("Memory allocation Failure!"); } return(daten); } 3. c-file: #include "write_termin.h" #include "w_binaer_file.h" #include <stdio.h> void write_binaer_file(char filename[],terminData* termindaten, int anz) { FILE* outFile=NULL; outFile=fopen(filename,"wb"); if(outFile != NULL) { if(anz != fwrite(termindaten,sizeof(terminData),anz,outFile)) { printf("error during write of %d blocks",anz); } } else { printf("File %s could not be opened",filename); } fclose(outFile); } 1. h-file: #ifndef _write_termin_h_ #define _write_termin_h_ 1 #define MAX_LEN 100 struct struct_termin { char topic[MAX_LEN]; char start_date[MAX_LEN]; char end_date[MAX_LEN]; char user[MAX_LEN]; char priorität[MAX_LEN]; char description[MAX_LEN]; char state[MAX_LEN]; }; typedef struct struct_termin terminData; terminData* write_termin(char filename[], int anz); #endif 2. h-file: #include "write_termin.h" #ifndef _wbinaer_file_h_ #define _wbinaer_file_h_ 1 void write_binaer_file(char filename[],terminData* termindaten, int anz); #endif
-
Hi
da ist nichts "ohne Debugging"
Du bist nach wie vor im Debugmodus.
Hab mir nicht alles angeschaut, hast aber komische Pointersachen da drin.
write_termin:
Du allokierst etwas für daten, in daten1 ist derweil NULL.
Dann überschreibst du daten mit daten1.
Ergebnis: Beide sind NULL.
Dann verwendest du daten...
Vllt. solltest du sinnvollere Variablennamen geben?
Und im main freigeben, was wo anders angelegt wurde, ist unschön.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
Auslesen von Datei ... fread
Von crsakawolf im Forum C/C++Antworten: 3Letzter Beitrag: 27.04.09, 16:18 -
Datei binär einlesen
Von Bastih84 im Forum C/C++Antworten: 16Letzter Beitrag: 27.04.05, 21:24 -
einlesen und ausgeben in binär
Von F_P_aus_K im Forum .NET ArchivAntworten: 0Letzter Beitrag: 08.11.04, 13:32 -
[C] Probleme mit fwrite & fread
Von Yupa im Forum C/C++Antworten: 4Letzter Beitrag: 14.03.04, 12:01 -
Wie funktioniert fread/fwrite
Von Bennily im Forum C/C++Antworten: 3Letzter Beitrag: 13.03.04, 19:04



16Danke

Zitieren


Login






