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


Anmelden zum Antworten