Mit Char array Datei auslesen und ausgeben
-
Hallo
Ich versuche gerade den Inhalt einer einfachen txt. Datei auszugeben und in einem Char Array zu schreiben, was im Prinzip auch klappt.
In der Datei sind die Einstellungen geschrieben, die man später aus dem array bekommen kann.
Das sieht so aus :Settings.txt Datei : Game_mode = 2 Set_FPS_Max = 30Mein Programm kann, wie schon gesagt, eigentlich diese Aufgabe gut erfüllen, wobei aber immer die letzten beiden character wiederholt ans Ende angehängt werden.
http://img202.imageshack.us/img202/93/textauslesen.png
In diesem Fall wird die 30 jeweils zweimal im array und beim lesen ausgegeben.Mein Programm sieh bisher so aus :
#include <iostream> #include <fstream> #include <cstdlib> //... int main() { //... ReadTheSettings(); //... return 0; } int ReadTheSettings() { // Create the reading object. ifstream Settingsreader; // Open the txt file and check for errors. cout << "Checking for errors"; Settingsreader.open("Settings.txt"); if (!Settingsreader.is_open()) exit(EXIT_FAILURE); cout << " ... done.\n"; cout << "Reading the data"; // Create the char array which holds all informations from the text. // The string is going to be used to check for variables in the file. char TextInput[50]; // Beinhaltet das Wort char Checkobject[1024]; // Beinhaltet den gesamten Inhalt. // Wir rbauchen einen eigenen Index-Zähler für Checkobject, da die untere For schleife den // Inhalt des arrays bei jedem neuen Wort überschreiben würde. unsigned int Count=0; // Solange wir nicht das Ende der Datei erreicht haben. while (Settingsreader.good()) { // Füge das nächste Wort dem Array TextInput hinzu. Settingsreader >> TextInput; // Schreibe alle Daten im Anhang des Checkobject. for (int i=0;i < strlen(TextInput);) { // Hier sieht man deutlich wie Count genutzt wird : Checkobject[Count] = TextInput[i]; i++; Count++; } // end for. // Wenn der letzte character des arrays eine Zahl enthält wissen wir , // das es sich hier um einen Zeilenumbruch handelt. if (Checkobject[Count - 1] == '0' || Checkobject[Count - 1] == '1' || Checkobject[Count - 1] == '2' || Checkobject[Count - 1] == '3' || Checkobject[Count - 1] == '4' || Checkobject[Count - 1] == '5' || Checkobject[Count - 1] == '6' || Checkobject[Count - 1] == '7' || Checkobject[Count - 1] == '8' || Checkobject[Count - 1] == '9') Checkobject[Count] = '\n'; // Alles andere bedeutet wir haben eine Leerstelle. else Checkobject[Count] = ' '; // Da wir in der if/else Bedingung auf dem array geschrieben haben müssen wir, // bevor wir zurück auf die for-schleife kommen, den index erhöhen. Count++; cout <<TextInput; } cout << " ... done\n\n==============================\nOutput :\n\n"; // Output schleife . for (int ii = 0;ii < strlen(Checkobject);ii++) { cout << Checkobject[ii] ; } cout << "\n==============================\n"; return 0 ; }Ich hoffe der Code is verständlich genug.
mfg
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Achja, das große Problem ist:
Wenn ich nach der Zahl für die FPS-Variable suche, bekomme ich die Zahl 3030 als Variable.
Aber diese Zahl ist eher unbrauchbar.
-
Du machst da einen Logikfehler:
Erst prüfst du, ob alles in Ordnung ist. Dann liest du aus der Datei. Was ist, wenn dabei etwas schiefgeht, z.B. das Dateiende erreicht wird? Du arbeitest dann trotzdem weiter und dadurch kommt Mist heraus.Die Prüfungslogik muss umgekehrt aussehen. Dazu könntest du beispielsweise die while-Schleife so formulieren:
while (Settingsreader >> TextInput) { // Verarbeitung von TextInput }
-
SeppJ schrieb:
Du machst da einen Logikfehler:
Erst prüfst du, ob alles in Ordnung ist. Dann liest du aus der Datei. Was ist, wenn dabei etwas schiefgeht, z.B. das Dateiende erreicht wird? Du arbeitest dann trotzdem weiter und dadurch kommt Mist heraus.Die Prüfungslogik muss umgekehrt aussehen. Dazu könntest du beispielsweise die while-Schleife so formulieren:
while (Settingsreader >> TextInput) { // Verarbeitung von TextInput }Das verstehe ich nicht.
Ich dachte eine while Schleife bricht dann ab, wenn die Bedingung nicht mehr erfüllt ist und das unabhängig vom Ort, wo sich das Programm gerade befindet.
Und da die Bedingungwhile (Settingsreader.good())darauf achtet sollte doch nach dem Ende keine Datei aus dem Textinput in den Settingsreader geraten.
-
Demian02 schrieb:
Das verstehe ich nicht.
Ich dachte eine while Schleife bricht dann ab, wenn die Bedingung nicht mehr erfüllt ist und das unabhängig vom Ort, wo sich das Programm gerade befindet.Nein. Beschäftige dich noch einmal mit Kontrollstrukturen und wie sie genau funktionieren.
-
SeppJ schrieb:
Demian02 schrieb:
Das verstehe ich nicht.
Ich dachte eine while Schleife bricht dann ab, wenn die Bedingung nicht mehr erfüllt ist und das unabhängig vom Ort, wo sich das Programm gerade befindet.Nein. Beschäftige dich noch einmal mit Kontrollstrukturen und wie sie genau funktionieren.
Hmm... Warum tauchen mit diesem Code keine doppelte oder zusätzliche Zeichen auf?
while (Settingsreader >> TextInput) { cout << TextInput; cout << endl; }Aber dieser Code :
while (Settingsreader >> TextInput) { for (int i=0;i < strlen(TextInput) && Settingsreader.good() ;Count++ && i++) { // Hier sieht man deutlich wie Count genutzt wird : Checkobject[Count] = TextInput[i]; } // end for. }Ich meine, der einzige Unterschied besteht nur darin, dass ich die Daten nicht ausgeben sondern in einen anderen array konvertiere.
Es kann dann doch nicht daran liegen, dass nur durch das konvertieren sonderbare oder doppelte Zeichen auftauchen?
Das kann doch unmöglich der Grund dafür sein.Hier nochmal die Ausgabe der beiden Codeabschnitte für das Verständnis:
http://img243.imageshack.us/g/gutercode.png/
(Das rechte Bild ist der erste Code und das linke Bild ist der zweite Code.)
-
Count++ && i++Das macht ganz was anderes als du denkst. Mach darausCount++ , i++.
-
SeppJ schrieb:
Count++ && i++Das macht ganz was anderes als du denkst. Mach darausCount++ , i++.So,ich glaube ich habs endlich hinbekommen.
Nichts taucht zweimal auf und sonderbare Zeichen bleiben auch weg.Ich leere zunächst, nachdem ich beide Arrays erstelle, den gesamten array von Checkobject.
Beim Konvertieren achte ich jedes mal, ob auch wirklich das Ende nicht erreicht wurde.
Mein Code sieht nun folgendermaßen aus :int ReadTheSettings() { // ... // Datei öffnen // ... char TextInput[50]; // Beinhaltet das Wort char Checkobject[1024]; // Beinhaltet den gesamten Inhalt. // Jetzt leere den gesamten Inhalt von Checkobject. { // Erstelle einen char-zeiger. char *chrptr = Checkobject; // Leere nun den gesamten Inhalt des Arrays. for(int index=0; index<1024; index++) { *chrptr = 0; chrptr++; } } // Wir rbauchen einen eigenen Index-Zähler für Checkobject, da die untere For schleife den // Inhalt des arrays bei jedem neuen Wort überschreiben würde. unsigned int Count=0; // Füge das nächste Wort dem Array TextInput hinzu. while (Settingsreader >> TextInput) { // Schreibe alle Daten im Anhang des Checkobject, solange // kein Ende erreicht wurde. for (int i=0;i < strlen(TextInput) ;i++, Count++) { if (Settingsreader.good()) { // Hier sieht man deutlich wie Count genutzt wird : Checkobject[Count] = TextInput[i]; } } // end for. // Nun testen wir ob das letzte Element von Checkobject eine Zahl beinhaltet. if (Checkobject[Count - 1] == '0' || Checkobject[Count - 1] == '1' || Checkobject[Count - 1] == '2' || Checkobject[Count - 1] == '3' || Checkobject[Count - 1] == '4' || Checkobject[Count - 1] == '5' || Checkobject[Count - 1] == '6' || Checkobject[Count - 1] == '7' || Checkobject[Count - 1] == '8' || Checkobject[Count - 1] == '9') Checkobject[Count] = '\n'; // Alles andere bedeutet wir haben eine Leerstelle. else Checkobject[Count] = ' '; // Da wir in der if/else Bedingung auf dem array geschrieben haben müssen wir, // bevor wir zurück auf die for-schleife kommen, den index erhöhen. Count++; cout <<TextInput; } cout << " ... done\n\n==============================\nOutput :\n\n"; // Output schleife . for (int Index = 0;Index < strlen(Checkobject);Index++) { cout << Checkobject[Index] ; } cout << "\n==============================\n"; return 0 ; }Danke SeppJ, ohne dich würde es Wochen dauern bis ich es hinbekommen hätte.