kramann.info
© Guido Kramann

Login: Passwort:










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