6.3 Bytestreams abspeichern und wieder einlesen
Das folgende Beispiel unterscheidet sich vom vorangegangenen nur darin, dass hier die Daten als Bytes abgelegt und wieder eingelesen werden, d.h. sie sind nur Maschinen-lesbar.
Verwendet wird dazu der Datentyp Union. Ein Union kann mehrere Deklarationen von Variablen einfachen Datentyps enthalten. Der Union-Datentyp reserviert einen bestimmten Speicherbereich für die Variablen, die in ihm definiert sind. Alerdings legt er nicht für jede Variable einen anderen Speicherbereich fest, sondern für alle in ihm definierten Variablen beginnt der Speicherbereich an der gleichen Stelle. Sie überlagern sich also. Wird in die eine Variable etwas hineingeschrieben, kann es mit der anderen abgerufen werden. Ist die eine Variable ein Integer und die zweite ein Byte-Array, dann erhält man im Byte-Array die Byte-Repräsentation der Integer-Variable. In unserem Fall wird das genutzt, um Integer-Werte in Bytes umzuwandeln.
#include <iostream>
#include <fstream>
#include "primfaktoren.h"
using namespace std;
#define INTGROESSE 4
const int MAXPRIMFAKTOREN = 10000;
union
{
int integer;
char byte[INTGROESSE];
} wandler;
//anzahl: Anzahl der in der Konsole uebergebenen Parameter + 1
//*wort[]: Array von Zeichen-Arrays, Index0: Programmname, Index1.. Parameter
int main(int anzahlWorte,char *(wort[]))
{
cout<<"Belegte Bytes fuer eine Integeger-Variable:"<<sizeof("int")<<endl;
int primfaktoren[MAXPRIMFAKTOREN];
if(anzahlWorte!=3)
{
cout<<"Benutzung:"<<endl;
cout<<"teiler <Ganzzahlige Frequenz> <zieldatei.txt>"<<endl;
return 1;
}
int frequenz = atoi(wort[1]);
int anzahlPrim = findePrimfaktoren(frequenz,primfaktoren);
ofstream ausgabe(wort[2]);
if(ausgabe) //Wenn Datei oeffnen funktioniert
{
for(int i=0;i<anzahlPrim;i++)
{
wandler.integer = primfaktoren[i];
for(int k=0;k<INTGROESSE;k++)
ausgabe<<wandler.byte[k];
}
}
else
{
cerr<<"FEHLER: Datei konnte nicht geoeffnet werden.";
}
return 0;
}
Code 6.3-1: teiler.cpp
#include <iostream>
#include <fstream>
using namespace std;
#define INTGROESSE 4
union
{
int integer;
char byte[INTGROESSE];
} wandler;
int main(int anzahlWorte,char *wort[])
{
if(anzahlWorte!=2)
cerr<<"Benutzung:"<<endl<<"lesen <Dateiname>"<<endl;
else
{
ifstream einlesen(wort[1]);
if(einlesen)
{
char zeichen;
int zahlen[1000];
int anzahl = 0;
while(einlesen.get(zeichen)) //hoert bei Whitespaces auf zu lesen
{
wandler.byte[0] = zeichen;
einlesen.get(zeichen);
wandler.byte[1] = zeichen;
einlesen.get(zeichen);
wandler.byte[2] = zeichen;
einlesen.get(zeichen);
wandler.byte[3] = zeichen;
zahlen[anzahl] = wandler.integer;
anzahl++;
}
cout<<"Zahlen in "<<wort[1]<<":"<<endl;
for(int i=0;i<anzahl;i++)
cout<<zahlen[i]<<" ";
}
else
cerr<<"Die Datei "<<wort[1]<<" konnte nicht geoeffnet werden."<<endl;
}
return 0;
}
Code 6.3-2: lesen.cpp
teiler.cpp, lesen.cpp, primfaktoren.h, teiler.exe und lesen.exe - Datei gepackt