Binär einlesen/auslesen(fread, fwrite)

Googlehupf

Erfahrenes Mitglied
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:
C++:
//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
 
Hi.
1. Was bedeutet der format ".dat"?
Nichts. Es ist eine beliebige Endung. "DATA"
2. Was bringt es überhaupt Werte binär in ein file schreiben in meinem Fall?
Was ist denn dein 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.
Alles auf dem Computer ist binär.

Der Editor zeigt aber natürlich Zeichen an und keine Bits.
4. fwrite() wandelt alle Zahlen auf den der Pointer actVal bzw. arrayValues zeigt in Binär um, oder wie funktioniert das genau?
fwrite wandelt gar nichts um. Die Daten werden so wie sie im Speicher stehen in die Datei geschrieben, Byte für Byte.

Gruß
 
1. Was bedeutet der format ".dat"?

Nix weiter. Dateiendungen sind nur Kosmetik und ich nehme an, man wollte damit ausdrücken, dass es sich um rohe DATen handelt. ".dat"


2. Was bringt es überhaupt Werte binär in ein file schreiben in meinem Fall?

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.


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.

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.


4. fwrite() wandelt alle Zahlen auf den der Pointer actVal bzw. arrayValues zeigt in Binär um, oder wie funktioniert das genau?

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_754-2008#Basic_formats und für das Beispiel hier http://en.wikipedia.org/wiki/Double...cision_binary_floating-point_format:_binary64 (siehe Bild)
 
Was ist denn dein Fall?

Ich soll ein Übungsprogramm schreiben das so in etwa aussehen soll:
Code:
Kurzbeschreibung : Programm zum Ueben von dynamischer Speicherverwaltung,binaeren FileIO. 
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?
 
Ja in diesem Fall muss ich binäres File io üben, aber was hat das mit Termindaten zu tun?
Es ist ein Übungsprogramm. Irgendwie muss man die Daten ja speichern. Es soll kein Textformat sein, sondern ein binäres Format.
Die Termine sollen in ein Binärfile gespeichert werden. Ja und mit "wb" schreibe ich binär in ein file korrekt?
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).
Ich weis halt nicht wie ich da anfangen könnte, ich schätze mal vieles mit scanf zum Eingeben der Termine, Priorität etc.
Ja, Benutzerinterface, Daten abfragen usw.

Dann Datenhaltung, speichern von Terminen usw.
Aber wie gesagt ich weiß gar nicht wie ich da Anfangen soll :(.
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ß
 
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 :)?
 
Sicher das das nicht komplezierter ist oder täuscht das?
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ß
 
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?
 
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 ;)
 

Neue Beiträge

Zurück