6.2 ASCII-Daten abspeichern und wieder einlesen
Auch in diesem Beispiel 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 aber 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;
//anzahl: Anzahl der in der Konsole uebergebenen Parameter + 1
//*wort[]: Array von Zeichen-Arrays, Index0: Programmname, Index1.. Parameter
int main(int anzahlWorte,char *(wort[]))
{
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++)
ausgabe<<primfaktoren[i]<<" ";
else
{
cerr<<"FEHLER: Datei konnte nicht geoeffnet werden.";
}
return 0;
}
Code 6.2-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.2-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(int anzahlWorte,char *wort[])
{
if(anzahlWorte!=2)
cerr<<"Benutzung:"<<endl<<"lesen <Dateiname>"<<endl;
else
{
ifstream einlesen(wort[1]);
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 "<<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.2-3: lesen.cpp
teiler.cpp, lesen.cpp, primfaktoren.h, teiler.exe und lesen.exe - Datei gepackt