<?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[&amp;quot;Guter&amp;quot; code?]]></title><description><![CDATA[<p>Hallo Leute, wollte mal wissen ob folgendes einem guten Stil entspricht oder was würdet ihr anders machen?<br />
Es ist ein Programm, welches eine Texteingabe speichert und sie in eine Datei speichert. Danach gelangt man zurück ins Menü man kann dieses beenden oder die Datei laden und weiter bearbeiten. Ich verwende außderdem eine map um durch strings in einer switch zu navigieren.</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;stdlib.h&gt;
#include &lt;string&gt;
#include &quot;def_function.h&quot;
#include &lt;vector&gt;

using namespace std;

int Save(const vector&lt;string&gt; &amp;save_text, const string save_name)
{
    ofstream save_file;
    save_file.open(save_name.c_str() , ofstream::app);
    vector&lt;string&gt;::const_iterator save_iter = save_text.begin();
    for(; save_iter != save_text.end(); ++save_iter){
        save_file &lt;&lt; *save_iter &lt;&lt; &quot; &quot;;
        cout &lt;&lt; *save_iter &lt;&lt; &quot; wurde gespeichert&quot; &lt;&lt; endl;
        fflush(stdin);
    }
    save_file.close();
    Menu();

    return 0;

}
vector&lt;string&gt; WordList()
{
    vector&lt;string&gt; wordlist_text;
    string word;
    while(cin &gt;&gt; word &amp;&amp; word != &quot;EXIT&quot;)
        wordlist_text.push_back(word);

    return wordlist_text;
}

void Menu()
{
    cout &lt;&lt; &quot;\t\t MENU \t\t\n&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;1. Neue Datei erstellen (new_dat)&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;2. Datei weiter bearbeiten (load_dat)&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;3. Programm schließen (exit)&quot; &lt;&lt; endl;
    map&lt;string, int&gt; choose;
    choose.insert(map&lt;string, int&gt;::value_type(&quot;new_dat&quot;, 1));
    choose.insert(map&lt;string, int&gt;::value_type(&quot;load_dat&quot; , 2));
    choose.insert(map&lt;string, int&gt;::value_type(&quot;exit&quot;, 3));
    string acc_choose;
    cin &gt;&gt; acc_choose;
    map&lt;string, int&gt;::iterator iter = choose.find(acc_choose);
    int find_choose = iter-&gt;second;
    switch(find_choose){
        case 1:{
                CLS;
                cout &lt;&lt; &quot;Bitte geben Sie einen Namen für Ihre Datei an:&quot; &lt;&lt; endl;
                string file_name;
                cin &gt;&gt; file_name;
                CLS;
                cout &lt;&lt; &quot;Die Eingabe kann nun begonnen werden:\n&quot; &lt;&lt; endl;
                vector&lt;string&gt; text = WordList();
                vector&lt;string&gt;::iterator iter = text.begin();
                Save(text, file_name);
                break;
        }

        case 2: {
                CLS;
                cout &lt;&lt; &quot;Bitte Namen der Datei angeben, die &quot; &lt;&lt;
                        &quot;geöffnet werden soll:&quot; &lt;&lt; endl;
                cout &lt;&lt; &quot;Nach dme laden der Datei kann die Eingabe&quot; &lt;&lt;
                        &quot; fortgesetzt werden.\n&quot; &lt;&lt; endl;
                string load_name;
                cin &gt;&gt; load_name;
                ifstream load_file(load_name.c_str());
                cout &lt;&lt; &quot;\n&quot; &lt;&lt; load_file.rdbuf();
                vector&lt;string&gt; load_text = WordList();
                Save(load_text, load_name);
                CLS;
                break;

        }
        case 3 : break;
    }
}

int main()
{
    cout &lt;&lt; &quot;Willkommen zum TextEditor 1.0&quot; &lt;&lt; endl;
    Menu();

    return EXIT_SUCCESS;
}
</code></pre>
<p>def_function Header:</p>
<pre><code class="language-cpp">#ifndef DEF_FUNCTION_H_INCLUDED
#define DEF_FUNCTION_H_INCLUDED

// ClearScreen Definition
#define CLS system(&quot;cls&quot;)

#include &lt;vector&gt;
#include &lt;string&gt;
//Funktionen
void Menu();
std::vector&lt;std::string&gt; WordList();
int Save(const std::vector&lt;std::string&gt;&amp;, const std::string);

#endif // DEF_FUNCTION_H_INCLUDED
</code></pre>
<p>Danke für eure Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>-GhostfaceChilla-</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307559/quot-guter-quot-code</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 18:01:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307559.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Aug 2012 21:09:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Wed, 29 Aug 2012 21:09:12 GMT]]></title><description><![CDATA[<p>Hallo Leute, wollte mal wissen ob folgendes einem guten Stil entspricht oder was würdet ihr anders machen?<br />
Es ist ein Programm, welches eine Texteingabe speichert und sie in eine Datei speichert. Danach gelangt man zurück ins Menü man kann dieses beenden oder die Datei laden und weiter bearbeiten. Ich verwende außderdem eine map um durch strings in einer switch zu navigieren.</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;stdlib.h&gt;
#include &lt;string&gt;
#include &quot;def_function.h&quot;
#include &lt;vector&gt;

using namespace std;

int Save(const vector&lt;string&gt; &amp;save_text, const string save_name)
{
    ofstream save_file;
    save_file.open(save_name.c_str() , ofstream::app);
    vector&lt;string&gt;::const_iterator save_iter = save_text.begin();
    for(; save_iter != save_text.end(); ++save_iter){
        save_file &lt;&lt; *save_iter &lt;&lt; &quot; &quot;;
        cout &lt;&lt; *save_iter &lt;&lt; &quot; wurde gespeichert&quot; &lt;&lt; endl;
        fflush(stdin);
    }
    save_file.close();
    Menu();

    return 0;

}
vector&lt;string&gt; WordList()
{
    vector&lt;string&gt; wordlist_text;
    string word;
    while(cin &gt;&gt; word &amp;&amp; word != &quot;EXIT&quot;)
        wordlist_text.push_back(word);

    return wordlist_text;
}

void Menu()
{
    cout &lt;&lt; &quot;\t\t MENU \t\t\n&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;1. Neue Datei erstellen (new_dat)&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;2. Datei weiter bearbeiten (load_dat)&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;3. Programm schließen (exit)&quot; &lt;&lt; endl;
    map&lt;string, int&gt; choose;
    choose.insert(map&lt;string, int&gt;::value_type(&quot;new_dat&quot;, 1));
    choose.insert(map&lt;string, int&gt;::value_type(&quot;load_dat&quot; , 2));
    choose.insert(map&lt;string, int&gt;::value_type(&quot;exit&quot;, 3));
    string acc_choose;
    cin &gt;&gt; acc_choose;
    map&lt;string, int&gt;::iterator iter = choose.find(acc_choose);
    int find_choose = iter-&gt;second;
    switch(find_choose){
        case 1:{
                CLS;
                cout &lt;&lt; &quot;Bitte geben Sie einen Namen für Ihre Datei an:&quot; &lt;&lt; endl;
                string file_name;
                cin &gt;&gt; file_name;
                CLS;
                cout &lt;&lt; &quot;Die Eingabe kann nun begonnen werden:\n&quot; &lt;&lt; endl;
                vector&lt;string&gt; text = WordList();
                vector&lt;string&gt;::iterator iter = text.begin();
                Save(text, file_name);
                break;
        }

        case 2: {
                CLS;
                cout &lt;&lt; &quot;Bitte Namen der Datei angeben, die &quot; &lt;&lt;
                        &quot;geöffnet werden soll:&quot; &lt;&lt; endl;
                cout &lt;&lt; &quot;Nach dme laden der Datei kann die Eingabe&quot; &lt;&lt;
                        &quot; fortgesetzt werden.\n&quot; &lt;&lt; endl;
                string load_name;
                cin &gt;&gt; load_name;
                ifstream load_file(load_name.c_str());
                cout &lt;&lt; &quot;\n&quot; &lt;&lt; load_file.rdbuf();
                vector&lt;string&gt; load_text = WordList();
                Save(load_text, load_name);
                CLS;
                break;

        }
        case 3 : break;
    }
}

int main()
{
    cout &lt;&lt; &quot;Willkommen zum TextEditor 1.0&quot; &lt;&lt; endl;
    Menu();

    return EXIT_SUCCESS;
}
</code></pre>
<p>def_function Header:</p>
<pre><code class="language-cpp">#ifndef DEF_FUNCTION_H_INCLUDED
#define DEF_FUNCTION_H_INCLUDED

// ClearScreen Definition
#define CLS system(&quot;cls&quot;)

#include &lt;vector&gt;
#include &lt;string&gt;
//Funktionen
void Menu();
std::vector&lt;std::string&gt; WordList();
int Save(const std::vector&lt;std::string&gt;&amp;, const std::string);

#endif // DEF_FUNCTION_H_INCLUDED
</code></pre>
<p>Danke für eure Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>-GhostfaceChilla-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246837</guid><dc:creator><![CDATA[GhostfaceChilla]]></dc:creator><pubDate>Wed, 29 Aug 2012 21:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Wed, 29 Aug 2012 21:34:35 GMT]]></title><description><![CDATA[<p>Ich würde von Grund auf alles anders aufziehen. Derzeit ist es rein prozedurale Programmierung. Genau so würde ein C-Programm aussehen, bloß die Datentypen und vorgefertigten Funktionen würden anders heißen. Der Code nutzt weder generische Programmierung noch Objektorientierung aus, die C++ gegenüber C direkt eingebaut hat. Muss man auch nicht nutzen, ergibt aber meistens besser wartbare und erweiterbare Lösungen, daher würde ich es schon guten Stil nennen.</p>
<p>Für ein funktionales Programm: Es ist ok'isch. Du nutzt an manchen Stellen systemabhängige Funktionalität und ich bin mir bei einigen davon (fflush(stdin)) nicht einmal sicher, ob dir das überhaupt bewusst ist.</p>
<p>Außerdem noch ein paar Kleinigkeiten:<br />
-stdio.h statt cstdio, wie es eigentlich heißt.<br />
-Gemischte Einbindung von Systemheadern und eigenen Headern statt übersichtlich zu trennen<br />
-Überhaupt darf man auch mal Leerzeilen benutzen<br />
-Von den Konstruktoren und Destruktoren eines fstreams scheinst du noch nie gehört zu haben<br />
-Was soll der Rückgabewert von Save?<br />
-Was will das const am zweiten Argument dem Nutze von Save sagen?<br />
-Die Funktionsnamen machen oft nicht klar, was eine Funktion tut.<br />
-Ebenso bei vielen Variablen.<br />
-Bei beiden ist auch die Grammatik der Namen ungewöhnlich. Variablen sind Dinge, (void) Funktionen tun etwas, Funktionen mit Rückgabewert geben ein Ding oder tun etwas. Du benutzt Nomen für Funktionen, Verben für Variablen und ähnliches. Sehr verwirrend.<br />
-Makros<br />
-Du hast oft temporäre Variablen, die in einer Zeile definiert, in der nächsten zugewiesen, in der dritten benutzt werden und dann nie wieder vorkommen.<br />
-Wozu ist eigentlich der Header, wenn alles eine Übersetzungseinheit ist?</p>
<p>Nicht so Kleinigkeiten:<br />
-Save/Menu ist ja rekursiv! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Ich denke da hast du einen ganz dicken Fehler gemacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /><br />
-Gib mal ungültige/unerwartete Daten ein!</p>
<p>Abschließend muss ich zurück nehmen: Nein, das ist nicht ok. Die &quot;Nicht so Kleinigkeiten&quot; sind zu krass und die &quot;Kleinigkeiten&quot; zu viele.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246839</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 29 Aug 2012 21:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Wed, 29 Aug 2012 21:38:47 GMT]]></title><description><![CDATA[<p>Ok, vielen dank ich werde mal alles überarbeiten.</p>
<p>-GhostafceChilla-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246843</guid><dc:creator><![CDATA[GhostfaceChilla]]></dc:creator><pubDate>Wed, 29 Aug 2012 21:38:47 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Wed, 29 Aug 2012 22:07:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#ifndef DEF_FUNCTION_H_INCLUDED
#define DEF_FUNCTION_H_INCLUDED

// ClearScreen Definition
// #define CLS system(&quot;cls&quot;) &lt;- kotz, graus, würg ;)

#include &lt;vector&gt;
#include &lt;string&gt;

// Funktionen // &lt;- Offensichtliches kommentiert man nicht.
// void Menu();
bool Menu();
std::vector&lt;std::string&gt; WordList();
// int Save(const std::vector&lt;std::string&gt;&amp;, const std::string);
void Save( std::vector&lt; std::string &gt; const &amp;text, std::string const &amp;filename );

#endif // DEF_FUNCTION_H_INCLUDED
</code></pre>
<p>&lt;- wofür eigentlich der Header?</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;cstdlib&gt; // #include &lt;stdlib.h&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;limits&gt; // numeric_limits

#include &lt;Windows.h&gt;
#undef max // Gaaahrrch MAKROS :/

#include &quot;def_function.h&quot; // nicht-Standard-Header nach den Standard-Headern

using namespace std;

void cls() // siehe unten
{
    COORD origin = { 0, 0 };
    DWORD chars_written;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD console_size;
    HANDLE std_out = GetStdHandle( STD_OUTPUT_HANDLE );
	GetConsoleScreenBufferInfo( std_out, &amp;csbi );
    console_size = csbi.dwSize.X * csbi.dwSize.Y;
	FillConsoleOutputCharacter( std_out, (TCHAR) ' ', console_size, origin, &amp;chars_written );
	GetConsoleScreenBufferInfo( std_out, &amp;csbi );
	FillConsoleOutputAttribute( std_out, csbi.wAttributes, console_size, origin, &amp;chars_written );
	SetConsoleCursorPosition( std_out, origin );
}

// int Save( const vector&lt; string &gt; &amp;save_text, const string save_name )
// Wofür der Prefix &quot;save_&quot; bei den Parametern?
// Warum int zurückgeben wenn eh immer 0 zurückgegeben wird?
// Warum den Dateinamen nicht auch als Referenz?
void Save( vector&lt; string &gt; const &amp;text, string const &amp;filename )
{
    // ofstream save_file;
	// Schon wieder der sinnfreie Präfix ...

	// file.open(save_name.c_str() , ofstream::app);
	// Warum in einen C-String wandeln?
	// Warum nicht den Konstruktor verwenden?
	ofstream file( filename, ofstream::app );

    // vector&lt;string&gt;::const_iterator save_iter = save_text.begin();
	// warum nicht im for-Statement?

    for( vector&lt; string &gt;::const_iterator i = text.begin(); i != text.end(); ++i ) {

		file &lt;&lt; *i &lt;&lt; &quot; &quot;;
        cout &lt;&lt; *i &lt;&lt; &quot; wurde gespeichert&quot; &lt;&lt; '\n'; // &lt;&lt; endl; &lt;- ist in den seltensten Fällen nötig.
        // fflush(stdin); warum stdin während der ausgabe flushen?
    }

	// file.close(); &lt;- macht der Destruktor am ende des Scopes
    // Menu(); &lt;- Wirklich!? Irgendwann ist der Stack voll ...

    // return 0; &lt;- Immer dieselbe Konstante zurückgeben bringt bei dieser Funktion nix.
}

vector&lt; string &gt; WordList()
{
    vector&lt;string&gt; wordlist_text;
    string word;
    while( cin &gt;&gt; word &amp;&amp; word != &quot;EXIT&quot; )
        wordlist_text.push_back( word );

    return wordlist_text;
}

// void Menu()
bool Menu() // gibt false zurück, wenn das Programm beendet werden soll.
{
    cout &lt;&lt; &quot;\t\t MENU \t\t\n\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben
    cout &lt;&lt; &quot;1. Neue Datei erstellen (new_dat)\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben
    cout &lt;&lt; &quot;2. Datei weiter bearbeiten (load_dat)\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben
    cout &lt;&lt; &quot;3. Programm schließen (exit)\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben

	map&lt; string, int &gt; choose;
    choose.insert(map&lt;string, int&gt;::value_type(&quot;new_dat&quot;, 1));
    choose.insert(map&lt;string, int&gt;::value_type(&quot;load_dat&quot; , 2));
    choose.insert(map&lt;string, int&gt;::value_type(&quot;exit&quot;, 3));

	string acc_choose;
    cin &gt;&gt; acc_choose;

	// map&lt;string, int&gt;::iterator iter = choose.find(acc_choose);
    // int find_choose = iter-&gt;second;

	switch( choose[ acc_choose ] ){

		case 1:
		{
            // CLS; &lt;- ein Makro für einen system()-call? Zwei undinge vereint ;)
			cls();
            cout &lt;&lt; &quot;Bitte geben Sie einen Namen für Ihre Datei an:\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben
            string file_name;
            cin &gt;&gt; file_name;

			cls();
			cout &lt;&lt; &quot;Die Eingabe kann nun begonnen werden:\n\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben
            vector&lt;string&gt; text = WordList();

			// vector&lt;string&gt;::iterator iter = text.begin(); &lt;- wofür genau?

			Save(text, file_name);
            break;
        }

        case 2:
		{
			// CLS; &lt;- oben.
			cls();
			// cout &lt;&lt; &quot;Bitte Namen der Datei angeben, die &quot; &lt;&lt;
			// &quot;geöffnet werden soll:&quot; &lt;&lt; endl;
			// cout &lt;&lt; &quot;Nach dme laden der Datei kann die Eingabe&quot; &lt;&lt;
			// &quot; fortgesetzt werden.\n&quot; &lt;&lt; endl;
			// also ein bisserl breitere Displays hamma inzwischen schon ...

			cout &lt;&lt; &quot;Bitte Namen der Datei angeben, die geöffnet werden soll:\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben
			cout &lt;&lt; &quot;Nach dme laden der Datei kann die Eingabe fortgesetzt werden.\n\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben

			string load_name;
			cin &gt;&gt; load_name;

			// ifstream load_file(load_name.c_str()); // &lt;- siehe oben.
			ifstream load_file( load_name );

			cout &lt;&lt; &quot;\n&quot; &lt;&lt; load_file.rdbuf();

			vector&lt;string&gt; load_text = WordList();
			Save(load_text, load_name);

			// warten, sonst siehst nix.
			cin.ignore( numeric_limits&lt; streamsize &gt;::max(), '\n' ); // alles verwerfen was vielleicht noch gepuffert ist
			cin.get();

			// CLS; &lt;- oben.
			cls();
			break;
        }
        case 3: // break;
			return false;
    }

	return true; // &lt;- weiter geht's ;)
}

int main()
{
    cout &lt;&lt; &quot;Willkommen zum TextEditor 1.0\n&quot;; //  &lt;&lt; endl; &lt;- siehe oben

	// Menu(); &lt;- nicht nur einmal:

	while( Menu() );

	// return EXIT_SUCCESS; &lt;- unnötig. main() gibt implizit 0 (aka EXIT_SUCCESS) zurück, wenn sie nichts zurückgibt.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2246851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246851</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 29 Aug 2012 22:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Wed, 29 Aug 2012 22:27:49 GMT]]></title><description><![CDATA[<p>Viele dank auch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Das einzigste was ich nicht kapier ist die <strong>void cls()</strong> Funktion...<br />
Ah und hab gedacth man soll nur dann Parameter zu Referenzen machen, wenn es sich auch lohnt, sprich bei containern etc. welche auch eine immense größe annehmen kann. Und habe gedacht das man strings nicht benutzen kann als Dateipfad in streams sondern nur C-Style strings??</p>
<p>-GhostfaceChilla-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246855</guid><dc:creator><![CDATA[GhostfaceChilla]]></dc:creator><pubDate>Wed, 29 Aug 2012 22:27:49 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Wed, 29 Aug 2012 22:54:32 GMT]]></title><description><![CDATA[<p>GhostfaceChilla schrieb:</p>
<blockquote>
<p>Das einzigste was ich nicht kapier ist die <strong>void cls()</strong> Funktion...</p>
</blockquote>
<p>Die ruft nur ein Paar WinAPI-Funktionen auf. Dokumentation dazu ist die MSDN.</p>
<p>GhostfaceChilla schrieb:</p>
<blockquote>
<p>Ah und hab gedacth man soll nur dann Parameter zu Referenzen machen, wenn es sich auch lohnt, sprich bei containern etc. welche auch eine immense größe annehmen kann.</p>
</blockquote>
<p><code>std::string</code> <em>ist</em> ein Container.</p>
<p>GhostfaceChilla schrieb:</p>
<blockquote>
<p>Und habe gedacht das man strings nicht benutzen kann als Dateipfad in streams sondern nur C-Style strings??</p>
</blockquote>
<p>ISO/IEC 14882:2011(E) schrieb:</p>
<blockquote>
<p>27.9.1.7 Constructors:</p>
<pre><code class="language-cpp">basic_ifstream();
explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const string&amp; s, ios_base::openmode mode = ios_base::in);
basic_ifstream(const basic_ifstream&amp; rhs) = delete;
basic_ifstream(basic_ifstream&amp;&amp; rhs);
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2246859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246859</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Wed, 29 Aug 2012 22:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Thu, 30 Aug 2012 01:31:48 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;limits&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;

class token_editor_t
{
	friend std::istream&amp; operator&gt;&gt; ( std::istream &amp;, token_editor_t &amp; );
	friend std::ostream&amp; operator&lt;&lt; ( std::ostream &amp;, token_editor_t const &amp; );

	private:
		bool ready;
		bool changed;
		std::string name;
		std::vector&lt; std::string &gt; tokens;

	public:
		typedef std::vector&lt; std::string &gt;::size_type size_type;

		token_editor_t( ) : ready( false ), changed( false ) { }

		bool is_ready() const { return ready; }
		bool is_changed() const { return changed; }
		bool is_empty() const { return tokens.empty(); }

		std::string const &amp; get_filename() const { return name; }
		size_type size() const { return tokens.size(); }

		void open( std::string const &amp;filename )
		{
			reset();
			std::fstream file( filename, std::ios::in );

			if( file.good() )
			{
				std::string token;
				while( file &gt;&gt; token )
					tokens.push_back( token );

				ready = true;
				name = filename;
			}
		}

		void save()
		{
			std::fstream file( name, std::ios::out | std::ios::trunc );

			for( std::vector&lt; std::string &gt;::const_iterator i = tokens.begin(); i != tokens.end(); ++i )
				file &lt;&lt; *i &lt;&lt; ' ';

			changed = false;
		}

		std::string remove( size_type index )
		{
			std::string token = tokens[ index ];
			tokens.erase( tokens.begin() + index );
			changed = true;
			return token;
		}

		void reset()
		{
			ready = false;
			changed = false;
			name = &quot;&quot;;
			tokens.clear();
		}
};

std::istream&amp; operator&gt;&gt; ( std::istream &amp;is, token_editor_t &amp;editor )
{
	std::string token;
	is &gt;&gt; token;
	editor.tokens.push_back( token );
	editor.changed = true;
	return is;
}

std::ostream&amp; operator&lt;&lt; ( std::ostream &amp;os, token_editor_t const &amp;editor )
{
	for( std::vector&lt; std::string &gt;::size_type i = 0; i != editor.tokens.size(); ++i )
		os &lt;&lt; &quot;  [&quot; &lt;&lt; i+1 &lt;&lt; &quot;] &quot; &lt;&lt; editor.tokens[ i ] &lt;&lt; '\n';

	return os;
}

int main()
{
	bool resume = true;
	token_editor_t token_editor;

	do {
		std::cout &lt;&lt; &quot;Token Editor:\n\n  [1] create\n  [2] open\n  [3] list\n  [4] add\n  [5] remove\n  [6] save\n  [7] discard\n  [8] exit\n\n  &gt;  &quot;;
		int choice = std::cin.get();
		std::cout.put( '\n' );

		bool create = false;
		std::string filename;

		switch( choice ) {

			case '1': // create

				create = true;

			case '2': // open;

				if( token_editor.is_changed() ) {

					std::cout &lt;&lt; &quot;There are unsaved changes. Please save or discard first!&quot;;
					break;
				}

				std::cout &lt;&lt; &quot;Please enter the name of the file to be &quot; &lt;&lt; ( create ? &quot;created&quot; : &quot;opened&quot; ) &lt;&lt; &quot;: &quot;;
				std::cin &gt;&gt; filename;
				token_editor.open( filename );
				break;

			case '3': // list

				if( !token_editor.is_empty() )
					std::cout &lt;&lt; token_editor;
				else std::cout &lt;&lt; &quot;Editor is empty!&quot;;
				break;

			case '4': // add
				if( token_editor.is_ready() ) {

					std::cout &lt;&lt; &quot;New token: &quot;;
					std::cin &gt;&gt; token_editor;
					std::cout &lt;&lt; &quot;Token added.&quot;;

				} else std::cout &lt;&lt; &quot;No file created or opened!&quot;;
				break;

			case '5': // remove

				if( !token_editor.is_empty() ) {

					std::cout &lt;&lt; token_editor;
					std::cout &lt;&lt; &quot;\n\nItem to remove: &quot;;

					token_editor_t::size_type delpos = 0;

					if( std::cin &gt;&gt; delpos &amp;&amp; delpos &amp;&amp; delpos + 1 &lt;= token_editor.size() )
						std::cout &lt;&lt; &quot;\nToken \&quot;&quot; &lt;&lt; token_editor.remove( --delpos ) &lt;&lt; &quot;\&quot; has been removed.&quot;;
					else std::cout &lt;&lt; &quot;Invalid index!&quot;;

				} else std::cout &lt;&lt; &quot;Editor is empty!&quot;;
				break;

			case '6': // save

				if( token_editor.is_changed() ) {

					token_editor.save();
					std::cout &lt;&lt; &quot;Changes saved to \&quot;&quot; &lt;&lt; token_editor.get_filename() &lt;&lt; '\&quot;';

				} else std::cout &lt;&lt; &quot;No changes made!&quot;;
				break;

			case '7': // discard

				if( token_editor.is_changed() ) {

					token_editor.reset();
					std::cout &lt;&lt; &quot;Changes discarded.&quot;;

				} else std::cout &lt;&lt; &quot;Nothing to discard!&quot;;
				break;

			case '8': // exit

				resume = false;
				break;
		}

		std::cout &lt;&lt; &quot;\n\n&quot;;
		std::cin.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' );

	} while( resume );
}
</code></pre>
<p>Selbe Frage wie Ghostface ( == &quot;Ihr dürft mich jetzt steinigen.&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246867</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 30 Aug 2012 01:31:48 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Guter&amp;quot; code? on Thu, 30 Aug 2012 04:19:08 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>-Save/Menu ist ja rekursiv! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Ich denke da hast du einen ganz dicken Fehler gemacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
</blockquote>
<p>Nein, das ist übersichtlicher. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <a href="http://www.c-plusplus.net/forum/307401" rel="nofollow">http://www.c-plusplus.net/forum/307401</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246873</guid><dc:creator><![CDATA[heheeehehe]]></dc:creator><pubDate>Thu, 30 Aug 2012 04:19:08 GMT</pubDate></item></channel></rss>