6.1 ASCII-Daten abspeichern und wieder einlesen
Im Programm teiler.cpp können die Primfaktoren der eingegebenen Quarzfrequenzen eingelesen und unter dem angegebenen Filenamen als ASCII-Daten abgespeichert werden. Dieses und das nächste Programm verwendet nicht die cin-Methoden, sondern die Eingaben werden als Parameter dem Programm beim Aufruf in der Konsole mitgegeben. Um beispielsweise die Teiler der Quarzfrequenz 20.000.000Hz zu bestimmen und das Ergebnis in 20MHz.txt zu speichern, muss folgendes in die Konsole eingegeben und dann Enter gedrückt werden:
Teiler 20000000 20MHz.txt
Vielleicht haben Sie schon einmal die Samplerate für CDs entdeckt: 44100Hz. Interessanterweise ist die Primfaktorzerlegung: 2,2,3,3,5,5,7,7.
#include <iostream>
#include <fstream>
#include "primfaktoren.h"
using namespace std;
const int MAXPRIMFAKTOREN = 10000;
int main(void)
{
int frequenz;
int primfaktoren[MAXPRIMFAKTOREN];
string filename;
cout<<"Geben Sie eine Frequenz in Hz an:"<<endl;
cin>>frequenz;
cout<<"Geben Sie einen Filenamen an:"<<endl;
cin>>filename;
int anzahlPrim = findePrimfaktoren(frequenz,primfaktoren);
ofstream ausgabe;
ausgabe.open(filename.data());
if(ausgabe) //Wenn Datei oeffnen funktioniert
{
for(int i=0;i<anzahlPrim;i++)
ausgabe<<primfaktoren[i]<<" ";
ausgabe.close();
}
else
{
cerr<<"FEHLER: Datei konnte nicht geoeffnet werden.";
}
return 0;
}
Code 6.1-1: teiler.cpp
int findePrimfaktoren(int zahl, int primfaktoren[])
{
int teiler=2;
int rest = zahl;
int anzahl = 0;
while(teiler<=zahl)
{
if(rest%teiler==0)
{
rest/=teiler;
primfaktoren[anzahl] = teiler;
anzahl++;
}
else
{
teiler++;
}
}
return anzahl;
}
Code 6.1-2: primfaktoren.h
Dem Programm lesen.cpp wird ein Filename angegeben. Es erwartet, dass in diesem File eine durch Kommata getrennte Integer-Zahlenfolge im ASCII-Format abgespeichert ist. Es liest die Zahlenfolge ein, wandelt die zahlen in Integer-Zahlen um und gibt sie auf der Konsole aus. Natürlich ist das keine besonders interessante Aktion, sie veranschaulicht aber, wie die Funktion einlesenInt(..) verwendet werden kann.
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
string filename;
cout<<"Geben Sie einen Filenamen an:";
cin>>filename;
ifstream einlesen(filename.data());
if(einlesen)
{
char zeichenkette[1000];
int zahlen[1000];
int anzahl = 0;
while(einlesen >> zeichenkette) //hoert bei Whitespaces auf zu lesen
{
zahlen[anzahl] = atoi(zeichenkette);
anzahl++;
}
cout<<"Zahlen in "<<filename<<":"<<endl;
for(int i=0;i<anzahl;i++)
cout<<zahlen[i]<<" ";
}
else
cerr<<"Die Datei "<<filename<<" konnte nicht geoeffnet werden."<<endl;
return 0;
}
Code 6.1-3: lesen.cpp
teiler.cpp, lesen.cpp, primfaktoren.h, teiler.exe und lesen.exe - Datei gepackt