std::ifstream und eingabe...
-
Vorgeschichte:
Also ich habe ein Projekt, was verschiedene Einstellungen aus einer Datei laden soll (hatte zu erst ne *.ini genommen und mit der WinAPI gearbeitet - aber hatte dann paar Dinge, die damit nur sehr umständlich zu bewerkstelligen sind und manche, die dem *.ini - Standard ne entsprechen)...Problem:
Auf jeden Fall schreib ich mir gerad selbst eine Klasse, die mir meine *.cfg-Datei ausliest - soll aber sowohl Kategorieen als auch Werte reinschreiben, wenn die noch nicht drinstehen... Und ehrlich gesagt hab ich von Streams nicht sooo viel Ahnung... ^^Lösungsansatz:
#include <string> #include <fstream> #include "explode.hpp" namespace Nini { const std::string filename (".\\data.cfg"); }; class Tini { private: //VAR std::ifstream *m_stream; const std::string m_filename; std::string m_actcat_string; std::streamoff m_actcat_streamoff; //long bool m_iscomment; /*NOT USED*/bool m_isquotet; private: //FKT void Rewind (void) { m_stream->seekg (0, std::ios_base::beg); m_iscomment = false; m_isquotet = false; }; bool search_cat (const std::string &_catname) { //unwichtig }; public: Tini (const std::string &_fn = Nini::filename) : m_filename (_fn) { //stimmt das eigtl? ein und ausgabe (also exklusiver zugriff) und nicht neu erstellen - oder hab ich die parameter da falsch gewählt? m_stream = new std::ifstream (m_filename.c_str (), std::ios::out | std::ios::in | std::ios::app); //ja - ich weiß, initialisierungsliste etc... aber so is übersichtlicher find ich :P }; ~Tini (void) { delete m_stream; }; void SetCat (const std::string &_catname) //Kategorie setzen - zur Not eben reinschreiben { Rewind (); if (!search_cat (_catname)) AddCat (_catname); m_actcat_streamoff = m_stream->tellg (); m_actcat_string = _catname; }; void AddCat (const std::string &_newcatname) { // HIER ist das Problem... m_stream->seekg (-2, std::ios_base::end); char _i[2]; *m_stream >> _i; if ((_i[0] != '\r') || (_i[1] != '\n')) *m_stream << "\r\n"; /*guckt, ob nen Zeilenumbruch am Ende der Datei ist Und SOLLTE dann eben Daten in die Datei reinschreiben */ *m_stream << "\t\t[" + _newcatname + "]" << std::endl; }; /*etc...*/ };Jetzt meine konkrete Frage:
Kann ich den gleichen Stream benutzen (und nur iwie verändern oder was würdet ihr mir raten? ^^)Danke schon mal...
Byebye
-
Wie wäre es, wenn Du die komplette Datei einliest, sie im Speicher verwaltest (z.B. per map<string, map<string, string> >) und am ende wieder zurückschreibst?
Das wäre sicher eine einfachere Handhabung als in der Datei hin und her zu springen.
-
hab ich auch schon überlegt (und angefangen gehabt bevor ich es mir dann doch wieder anders überlegt hab und das ganze noch ma neu gemacht hab ^^) - aber mich aus irgendwelchen gründen dann doch anders entschieden gehabt ^^ mir fällt gerad nicht ma mehr ein, warum -.-
naja... dann mach ich es wohl doch so
bb