<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Eure Meinung ist gefragt]]></title><description><![CDATA[<p>Ich hatte das Problem, dass mein Programm &quot;von aussen&quot; mit einer Konfigurationsdatei Einstellungen einlesen können sollte. Da ich leider keine fertige Lösung gefunden habe, habe ich selber eine geschrieben.</p>
<p>Die Datei sieht dabei so aus:</p>
<p>Prog.conf:</p>
<pre><code>Schlüsselwort1 = 1000;
Schlüsselwort2 = 2000;
Ende
</code></pre>
<p>Anwendung:</p>
<pre><code class="language-cpp">std::string datei(&quot;conf.ini&quot;),//Deffinition Dateiname der Konfiguratonsdatei
port(&quot;Port = &quot;);//Schlüsselwörter
int portr=0//Hier wird der ausgelesene Wert gespeichert

error = lkonf(datei, port, portr);//Funktionsaufruf
</code></pre>
<p>Was mich vor allem interessiert ist, wie ihr es gelöst hättet. Welche Fehler im Code sind. Welche Ausnahmeregelungen noch zu treffen sind etc.</p>
<p>Hier der Code:</p>
<p>schltxt.h</p>
<pre><code class="language-cpp">//Funktion sucht in einer Datei nach einem String und extrahiert einen Zahlenwert.
//lkonf steht für &quot;lese Konfiguration&quot;
int lkonf(std::string, std::string, int&amp;);//Schlüsseltext, Dateiname, gesuchte; Variable gibt Fehlercode zurück

//Funktion schreibt den Schlüsseltext in die Datei. Hängt an das Dateiende den Schlüsseltext an.
//Vorher prüfen ob der Text nicht vorkommt, da der String einfach ans Ende angehängt wird.
int skonf(std::string, std::string, int);//Dateiname, Schlüsseltext, Variablenwert; gibt Fehlercode zurück

//Liefert den entsprechnenden Fehlertext
void errtxt(int, std::string&amp;);//Fehlercode, String in den der Fehlertext geschrieben werden soll
</code></pre>
<p>schltxt.cpp</p>
<pre><code class="language-cpp">int lkonf(std::string dname, std::string stxt, int&amp; rueck)
{
	int error = 0;//Gibt an ob ein Fehler enstanden ist

	//=== Öffnen der Datei ===

	std::fstream DATEI(dname.c_str(), std::ios::in);//Öffnet die übergebene Datei zum lesen

	if(DATEI.is_open() == true)
	{
		error = 0;//Fehlerspeicher 0, Datei vorhanden
		unsigned int Dateilaenge = 0;//Speichert die Dateilaenge

		DATEI.seekg(0);// An den Dateianfang springen
		//Auf die Datei kann jetzt mit DATEI zugegriffen werden

		//=== Auslesen des Dateiinhalts ===

		unsigned int  i=0; //Dateipositionszähler
		char j='\0'; //Zwischenspeicher des Dateiinhaltes
		std::string such;

		while(!DATEI.eof())//Die Datei bis zum Ende durchgehen
		{
			DATEI.get(j);//Das nächste Zeichen einlesen
			such += j;//und an den Arbeitsstring anhängen
			i++;//Ein Zeichen weiterschalten
		}
		//Der Dateiinhalt steht jetzt in der Variablen &quot;such&quot; zur Verfügung

		Dateilaenge = unsigned int(such.length());

		//=== Sucht im Dateiinhalt nach dem gesuchten Text ===

		std::string::size_type START = 0;//Speichert den Startpunkt des gesuchten Strings
		std::string::size_type ENDE = 0;//Zeigt auf den nächsten Zeilenumbruch nach dem gesuchten String (Stringende)
		std::string::size_type ZEILU = 0;//Speichert den Zeilenumbruch nach dem START

		START  = such.find(stxt,0);//Die Funktion sucht in der Datei nach dem gesuchten Schlüsseltext

		if(START &gt;= Dateilaenge)
		{
			error = 2;//Der gesuchte String konnte nicht gefunden werden
		}
		else
		{
			error = 0;
			size_t laenge = stxt.size();//Die Länge des Schlüsseltextes finden (&quot;Schlüsseltext = &quot;)
			ZEILU = such.find(&quot;\n&quot;, START);//Sucht das Zeilenende nach dem Start des Schlüsselwortes
			ENDE  = such.find(&quot;;&quot;, START);//Sucht nach dem nächsten Semikolon nach dem Beginn des Schlüsseltextes (Stringende)
			//Es stehen der Anfang und das Ende des gesuchten Strings nun in START und ENDE zur Verfügung

			if(ZEILU &lt;= ENDE)
			{
				error = 3;//Semikolon am Ende der Zeile fehlt -&gt; Komentar
			}
			if(START+laenge == ENDE)
			{
				error = 4;//Schlüsseltext vorhanden jedoch kein Wert eingetragen
			}
			else
			{
				error = 0;

				//=== Extrahieren des Schlüsseltextes ===

				std::string ergebnis;//Speicher für den Schlüsseltext mit Wert

				size_t m = START+laenge;//Nach dem Schlüsseltext steht der geuchte Wert. m ist der Begin des Wertes
				do{
					ergebnis += such.at(m);//Den gesuchten Wert zeichenweise speichern
					m++;//Ein Zeichen weiterschalten
				}while(m &lt;= ENDE);//So lange bis man an das Zeilenende kommt

				// === Rückgabe ===
				rueck = atoi(ergebnis.c_str()); //Umwandlung des Strings in einen C-String danach in einen Integer und danach Rückgabe an das aufrufende Programm
			}
		}
	}
	else
	{
		error = 1;//Datei konnte nicht gefunden werden
	}

	DATEI.close();//Datei schliessen
	return error;
}

int skonf(std::string dname, std::string stxt, int vari)
{
	int error = 0; //Fehlercode 0 = alles OK
	std::fstream DATEI(dname.c_str(), std::ios::out | std::ios::app);//Öffnet die übergebene Datei zum schreiben oder legt Sie an, wenn sie nicht gefunden werden kann.
	if(DATEI.is_open() == true)//Prüft ob die Datei vorhanden ist
	{
		error = 0;//Alles OK
		DATEI &lt;&lt; &quot;\n&quot; &lt;&lt; stxt &lt;&lt; vari &lt;&lt; &quot;;&quot;; //Schreibt den String und den Wert in die Datei, sodass die Ausleseroutine ihn extrahieren kann
	}
	else
	{
		error = 1;//Wenn die Datei nicht gefunden werden konnte
	}
	return error;
}

void errtxt(int errstf, std::string&amp; errmldg)
{
	//errstf = Error Stufe
	if(errstf == 0)
	{
		errmldg = &quot;Kein Fehler aufgetreten&quot;;
	}
	else if(errstf == 1)
	{
		errmldg = &quot;Datei konnte nicht gefunden werden&quot;;
	}
	else if(errstf == 2)
	{
		errmldg = &quot;Der gesuchte Schl\x81sseltext konnte nicht gefunden werden&quot;;
	}
	else if(errstf == 3)
	{
		errmldg = &quot;Syntax Error, Semikolon am Zeilenende fehlt. Bitte ergänzen&quot;;
	}
	else if(errstf == 4)
	{
		errmldg = &quot;Syntax Error, Bitte tragen Sie einem Wert ein&quot;;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/145221/eure-meinung-ist-gefragt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 03:10:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/145221.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 26 Apr 2006 06:21:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eure Meinung ist gefragt on Wed, 26 Apr 2006 06:21:57 GMT]]></title><description><![CDATA[<p>Ich hatte das Problem, dass mein Programm &quot;von aussen&quot; mit einer Konfigurationsdatei Einstellungen einlesen können sollte. Da ich leider keine fertige Lösung gefunden habe, habe ich selber eine geschrieben.</p>
<p>Die Datei sieht dabei so aus:</p>
<p>Prog.conf:</p>
<pre><code>Schlüsselwort1 = 1000;
Schlüsselwort2 = 2000;
Ende
</code></pre>
<p>Anwendung:</p>
<pre><code class="language-cpp">std::string datei(&quot;conf.ini&quot;),//Deffinition Dateiname der Konfiguratonsdatei
port(&quot;Port = &quot;);//Schlüsselwörter
int portr=0//Hier wird der ausgelesene Wert gespeichert

error = lkonf(datei, port, portr);//Funktionsaufruf
</code></pre>
<p>Was mich vor allem interessiert ist, wie ihr es gelöst hättet. Welche Fehler im Code sind. Welche Ausnahmeregelungen noch zu treffen sind etc.</p>
<p>Hier der Code:</p>
<p>schltxt.h</p>
<pre><code class="language-cpp">//Funktion sucht in einer Datei nach einem String und extrahiert einen Zahlenwert.
//lkonf steht für &quot;lese Konfiguration&quot;
int lkonf(std::string, std::string, int&amp;);//Schlüsseltext, Dateiname, gesuchte; Variable gibt Fehlercode zurück

//Funktion schreibt den Schlüsseltext in die Datei. Hängt an das Dateiende den Schlüsseltext an.
//Vorher prüfen ob der Text nicht vorkommt, da der String einfach ans Ende angehängt wird.
int skonf(std::string, std::string, int);//Dateiname, Schlüsseltext, Variablenwert; gibt Fehlercode zurück

//Liefert den entsprechnenden Fehlertext
void errtxt(int, std::string&amp;);//Fehlercode, String in den der Fehlertext geschrieben werden soll
</code></pre>
<p>schltxt.cpp</p>
<pre><code class="language-cpp">int lkonf(std::string dname, std::string stxt, int&amp; rueck)
{
	int error = 0;//Gibt an ob ein Fehler enstanden ist

	//=== Öffnen der Datei ===

	std::fstream DATEI(dname.c_str(), std::ios::in);//Öffnet die übergebene Datei zum lesen

	if(DATEI.is_open() == true)
	{
		error = 0;//Fehlerspeicher 0, Datei vorhanden
		unsigned int Dateilaenge = 0;//Speichert die Dateilaenge

		DATEI.seekg(0);// An den Dateianfang springen
		//Auf die Datei kann jetzt mit DATEI zugegriffen werden

		//=== Auslesen des Dateiinhalts ===

		unsigned int  i=0; //Dateipositionszähler
		char j='\0'; //Zwischenspeicher des Dateiinhaltes
		std::string such;

		while(!DATEI.eof())//Die Datei bis zum Ende durchgehen
		{
			DATEI.get(j);//Das nächste Zeichen einlesen
			such += j;//und an den Arbeitsstring anhängen
			i++;//Ein Zeichen weiterschalten
		}
		//Der Dateiinhalt steht jetzt in der Variablen &quot;such&quot; zur Verfügung

		Dateilaenge = unsigned int(such.length());

		//=== Sucht im Dateiinhalt nach dem gesuchten Text ===

		std::string::size_type START = 0;//Speichert den Startpunkt des gesuchten Strings
		std::string::size_type ENDE = 0;//Zeigt auf den nächsten Zeilenumbruch nach dem gesuchten String (Stringende)
		std::string::size_type ZEILU = 0;//Speichert den Zeilenumbruch nach dem START

		START  = such.find(stxt,0);//Die Funktion sucht in der Datei nach dem gesuchten Schlüsseltext

		if(START &gt;= Dateilaenge)
		{
			error = 2;//Der gesuchte String konnte nicht gefunden werden
		}
		else
		{
			error = 0;
			size_t laenge = stxt.size();//Die Länge des Schlüsseltextes finden (&quot;Schlüsseltext = &quot;)
			ZEILU = such.find(&quot;\n&quot;, START);//Sucht das Zeilenende nach dem Start des Schlüsselwortes
			ENDE  = such.find(&quot;;&quot;, START);//Sucht nach dem nächsten Semikolon nach dem Beginn des Schlüsseltextes (Stringende)
			//Es stehen der Anfang und das Ende des gesuchten Strings nun in START und ENDE zur Verfügung

			if(ZEILU &lt;= ENDE)
			{
				error = 3;//Semikolon am Ende der Zeile fehlt -&gt; Komentar
			}
			if(START+laenge == ENDE)
			{
				error = 4;//Schlüsseltext vorhanden jedoch kein Wert eingetragen
			}
			else
			{
				error = 0;

				//=== Extrahieren des Schlüsseltextes ===

				std::string ergebnis;//Speicher für den Schlüsseltext mit Wert

				size_t m = START+laenge;//Nach dem Schlüsseltext steht der geuchte Wert. m ist der Begin des Wertes
				do{
					ergebnis += such.at(m);//Den gesuchten Wert zeichenweise speichern
					m++;//Ein Zeichen weiterschalten
				}while(m &lt;= ENDE);//So lange bis man an das Zeilenende kommt

				// === Rückgabe ===
				rueck = atoi(ergebnis.c_str()); //Umwandlung des Strings in einen C-String danach in einen Integer und danach Rückgabe an das aufrufende Programm
			}
		}
	}
	else
	{
		error = 1;//Datei konnte nicht gefunden werden
	}

	DATEI.close();//Datei schliessen
	return error;
}

int skonf(std::string dname, std::string stxt, int vari)
{
	int error = 0; //Fehlercode 0 = alles OK
	std::fstream DATEI(dname.c_str(), std::ios::out | std::ios::app);//Öffnet die übergebene Datei zum schreiben oder legt Sie an, wenn sie nicht gefunden werden kann.
	if(DATEI.is_open() == true)//Prüft ob die Datei vorhanden ist
	{
		error = 0;//Alles OK
		DATEI &lt;&lt; &quot;\n&quot; &lt;&lt; stxt &lt;&lt; vari &lt;&lt; &quot;;&quot;; //Schreibt den String und den Wert in die Datei, sodass die Ausleseroutine ihn extrahieren kann
	}
	else
	{
		error = 1;//Wenn die Datei nicht gefunden werden konnte
	}
	return error;
}

void errtxt(int errstf, std::string&amp; errmldg)
{
	//errstf = Error Stufe
	if(errstf == 0)
	{
		errmldg = &quot;Kein Fehler aufgetreten&quot;;
	}
	else if(errstf == 1)
	{
		errmldg = &quot;Datei konnte nicht gefunden werden&quot;;
	}
	else if(errstf == 2)
	{
		errmldg = &quot;Der gesuchte Schl\x81sseltext konnte nicht gefunden werden&quot;;
	}
	else if(errstf == 3)
	{
		errmldg = &quot;Syntax Error, Semikolon am Zeilenende fehlt. Bitte ergänzen&quot;;
	}
	else if(errstf == 4)
	{
		errmldg = &quot;Syntax Error, Bitte tragen Sie einem Wert ein&quot;;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1045389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045389</guid><dc:creator><![CDATA[Dippl Insch]]></dc:creator><pubDate>Wed, 26 Apr 2006 06:21:57 GMT</pubDate></item><item><title><![CDATA[Reply to Eure Meinung ist gefragt on Wed, 26 Apr 2006 08:15:05 GMT]]></title><description><![CDATA[<p>Ohne mir den Quelltext jetzt genauer anzuschauen, hätte ich die zeile nach einem &quot;=&quot; durchsucht, alles was davor kommt ist dann dein schlüsselwort (am besten noch <em>trim</em>en). Alles was danach ist, kannst du dann mittels stringstream in einen int verwandeln.<br />
Und das alles dann in eine map&lt;string, int&gt; speichern.<br />
Wozu brauchst du eigentlich das &quot;Ende&quot; Schlüsselwort?</p>
<p>P.S.: Hab die &quot;;&quot; übersehen. Also erst nach denen suchen (am besten die ganze datei in einem rutsch lesen, ohne rücksicht auf '\n', dann spliten und dann nach &quot;=&quot; suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045437</guid><dc:creator><![CDATA[cin]]></dc:creator><pubDate>Wed, 26 Apr 2006 08:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to Eure Meinung ist gefragt on Wed, 26 Apr 2006 08:26:02 GMT]]></title><description><![CDATA[<p>Unter WinAPI könntest du auch noch GetPrivateProfileInt() und Konsorten verwenden - die verwenden INI-Dateien, die nach einer ähnlichen Struktur aufgebaut sind:</p>
<pre><code>[Sektion 1]
Var1=Wert1
Var2=Wert2

[Sektion 2]
Var3=Wert3
Var1=Wert1b
</code></pre>
<p>PS: Und ich bin mir ziemlich sicher, deinen Code kann man noch optimieren - das sieht ja (nach erstem Überblick) grauenhaft aus.</p>
<p>(ich hab' mir jetzt nicht alles angesehen, aber zumindest die errtext()-Funktion kann man eleganter per switch() oder über ein string-Array lösen:</p>
<pre><code class="language-cpp">string errtext(int errstf)
{
  static const string msgs[]={
    &quot;Kein Fehler aufgetreten&quot;,
    &quot;Datei konnte nicht gefunden werden&quot;
    &quot;Der gesuchte Schl\x81sseltext konnte nicht gefunden werden&quot;,
    &quot;Syntax Error, Semikolon am Zeilenende fehlt. Bitte ergänzen&quot;,
    &quot;Syntax Error, Bitte tragen Sie einem Wert ein&quot;,
    &quot;Unbekannter Fehler&quot;
  };
  static const int msgs_ct = sizeof(msgs)/sizeof(msgs[0]);
  if(errstf&gt;=msgs_ct) errstf=msgs_ct-1;
  return msgs[errstf];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1045441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045441</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 26 Apr 2006 08:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Eure Meinung ist gefragt on Wed, 26 Apr 2006 08:48:47 GMT]]></title><description><![CDATA[<p>Das Ende Schlüsselwort stammt noch aus einer alten Version, welche das Semikolon nicht kannte und den Zeilensprung als Endkennung hatte. Das Ende bewirkt dann einen Zeilensprung in der letzten Zeile. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Ich habe den Tipp mit switch Gleich mal umgesetzt.</p>
<p>Mit der Zeit vergisst man so manche Dinge. Ausserdem bin ich noch nicht sooo lange dabei.</p>
<p>Was genau sieht denn so grauenhaft aus? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045454</guid><dc:creator><![CDATA[Dippl Insch]]></dc:creator><pubDate>Wed, 26 Apr 2006 08:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to Eure Meinung ist gefragt on Wed, 26 Apr 2006 08:57:22 GMT]]></title><description><![CDATA[<p>Erstmal brauchst du den Fehlerstatus nicht so ewig mitschleifen - wenn es einen Fehler gab, brichst du per &quot;return xxx;&quot; ab und gut ist. (das erspart auch einige if-else-Kaskaden in deiner Funktion)</p>
<p>Zweitens kannst du eine Textzeile schneller per getline() einlesen (hat sogar den Vorteil, daß du den Zeilenwechsel als Endemarke verwenden kannst - da brauchst du weder ein ; am Zeilenende noch ein &quot;ENDE&quot; zum Abschluß).</p>
<p>Und drittens prüft man besser auf datei.fail() als auf datei.eof() - sonst landest du in einer Endlosschleife, wenn beim Einlesen Formatfehler o.ä. aufgetreten sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1045465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1045465</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 26 Apr 2006 08:57:22 GMT</pubDate></item></channel></rss>