Drücken der Pfeiltaste wandelt Textdatei in Binärdatei um

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Drücken der Pfeiltaste wandelt Textdatei in Binärdatei um

Beitrag von Bebu » Mi Nov 11, 2009 10:22 pm

Mir ist leider keine bessere Überschrift eingefallen. Ich entwickle momentan eine Klasse die einen Menschen darstellen soll. Dieser Mensch kann für verschiedene Tätigkeiten in Frage kommen, oder halt auch nicht. Das ganze läuft auf ein Programm hinaus das mir automatisch eine Liste generiert, um verschiedene Personen für vier verschiedene Tätigkeiten einzuteilen. Dabei muss berücksichtigt werden, das eine Person nicht zwei Tätigkeiten gleichzeitig machen kann und auch nicht mehrmals hintereinander dran sein soll und an bestimmten Tagen auch verhindert sein kann. Meine Klasse nimmt die Personen auf und schreibt sie in eine Datei. So viel am Rande, hier der Abschnitt der mir Problem macht:

Code: Alles auswählen

    void inputname() //Liest den Nachnamen der Klassenstruktur ein(GETESTET/ABGESCHLOSSEN)
    {
        while(1)
        {
            cout << textname;
            cin >> person.name;

            if (cin.good())
            {
                clear();

                if (Debug == true)
                {
                    cout << "Streamstatus OK bei inputname()" << endl;
                }
                break;
            }
            else
            {
                clear();

                if (Debug == true)
                {
                    cout << "Streamstatus BAD bei inputname()" << endl;
                }
            }
        }
    }

    int handle_file() //Dateizugriff-Datei öffnen/schließen--Neuer Bereich oder Änderung(CRITICAL BUG!!!!)
    {
        ofstream file; //Dateiobjekt erzeugen
        file.open(filename.c_str(), ios_base::out | ios_base::app);
        if (!file)
        {
            cerr << "CRITICAL ERROR: Could not open File " << filename << endl;
            return 1;
        }
        file << "SECTION_START" << endl;
        file << "id=" << person.id << endl;
        file << "name=" << person.name << endl;
        file << "vorname=" << person.vorname << endl;
        file << "buehne=" << handle_enum(person.buehne) << endl;
        file << "mikro=" << handle_enum(person.mikro) << endl;
        file << "tuer=" << handle_enum(person.tuer) << endl;
        file << "anlage=" << handle_enum(person.anlage) << endl;
        file << "SECTION_END" << endl;
        file.close();
        return 0;
    }
    string handle_enum(int i) //Eingaben der Aufzählung lesbar für Datei umwandeln(GETESTET/ABGESCHLOSSEN)
    {
        if (i==0) return "NO";
        else if (i==1) return "YES";
        else if (i==2) return "JUMPER";
        else
        {
            cerr << "UNCRITICAL-ERROR in Function \"handle_enum()\"" << endl;
            cerr << "Given INT is not in allowed range" << endl;
            return "ERROR";
        }
    }
Das ganze funktioniert wunderbar, so lange ich nicht bei der Eingabe des Namens auf eine der Pfeiltasten oder F-Tasten drücke und mit Enter bestätige.
Rufe ich danach nämlich die handle_file Funktion auf, um die Eingaben in die Datei zu schreiben, wird aus meiner Textdatei eine Binärdatei. Das ist natürlich unerwünscht und kann mir die ganze Liste unbrauchbar machen.
Wie kann ich mein Programm dazu zwingen, mir in jedem Fall nur Textelemente in die Datei zu schreiben? Das kann auch ein Errorcode sein, immer noch besser, als die ganze Datei zu schrotten.

Gruß Bebu
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Drücken der Pfeiltaste wandelt Textdatei in Binärdatei um

Beitrag von nufan » Do Nov 12, 2009 12:14 am

Du kannst mit isprint prüfen, ob das eingegebene Zeichen druckbar ist. Etwa so:

Code: Alles auswählen

for (int i = 0; i < strlen (str); i++)
  if (!isprint (str[i]))
  {
    cerr << "wrong character" << endl;
    file.close ();
    return 1;
  }
Das verhindert zumindest, dass irgendwelche falschen Zeichen in die Datei geschrieben werden.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Drücken der Pfeiltaste wandelt Textdatei in Binärdatei um

Beitrag von Bebu » Do Nov 12, 2009 8:01 am

Oh das ging ja schnell. Ich werde versuchen es einzubauen, aber ich denke, das ist genau das, was ich gesucht habe. Vielen Dank
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Drücken der Pfeiltaste wandelt Textdatei in Binärdatei um

Beitrag von Bebu » Do Nov 12, 2009 9:33 pm

So jetzt habe ich es eingebaut. Nochmal vielen Dank für den Tipp mit der Funktion, in die Richtung hätte ich wohl so schnell nicht gedacht :oops:

Hier die angepasste Funktion:

Code: Alles auswählen

 void inputname() //Liest den Nachnamen der Klassenstruktur ein(GETESTET/ABGESCHLOSSEN)
    {
        int streamstate = -1;
        int printable = -1;
        string temp;

        while(1)        //Endlosschleife starten
        {
            streamstate = -1; //Variablen auf sicheren Wert setzten
            printable = -1;

            cout << textname;    //Ausgabe des unter objekt.textname hinterlegten Stings

            cin >> temp;         //Eingabe in Temporäre Varible schreiben

            if (cin.good())      //Streamstatus überprüfen und Statusvarible setzten + Pufferleerung
            {
                clear();
                streamstate = 0;
            }
            else
            {
                clear();
                streamstate = 1;
            }

            for (unsigned int i = 0; i <= (temp.length()-1); i++) //string.length ist unsigned, Zählervariable gleichsetzten
            {                                                     //letztes Zeichen im String nicht berücksichtigen da nicht druckbar, aber notwendig
                if (!isprint(temp[i]))  //Wenn nich druckbares Zeichen vorkommt, Statusvariable setzen, For-Schleife abbrechen
                {
                    printable = 1;
                    break;
                }
                else printable = 0;
            }

            if (Debug == true)          //Debugausgaben
            {
                if (streamstate == 0) cout << "streamstate GOOD in function inputname()" << endl;
                if (streamstate == 1) cout << "streamstate BAD in function inputname()" << endl;

                if (printable == 0)   cout << "All inputed chars printable" << endl;
                if (printable == 1)   cout << "Critical: Inputed chars not printable" << endl;;
            }
        if (streamstate == 0 && printable == 0) break; // Überprüfe Statusvariablen zum Beenden der Endlosschleife
        }
    }
C kann einen ganz schön ärgern, hab ich grade wieder festgestellt. Ich hab 20 Minuten gesucht, nur um festzustellen das ich, statt einer Variable einen Wert zuzuweisen, einen Vergleichsoperator geschrieben habe :x
Gruß Bebu
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten