<?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[stringstreams, bei Leerzeichen Zeilenumbruch verhindern]]></title><description><![CDATA[<p>Hallo, ich habe ein kleines Problem.<br />
Ich will aus einer Textdatei, wie z.B. dieser hier: (daten_personen_1)</p>
<pre><code>Jonathan Tobias;Schulze;
Gabriel;Meier Müller;
</code></pre>
<p>die einzelnen Felder auslesen (getrennt durch ein Semikolon), im Programm weiterverarbeiten und anschließend wieder in dem selben Format in eine andere Datei schreiben. Hier ergibt sich allerdings das Problem, dass ich bei jedem Leerzeichen ein Zeilenumbruch habe, wie folgende Datei zeigt: (daten_personen_2)</p>
<pre><code>Jonathan
Tobias;Schulze;
Gabriel;Meier
Müller;
</code></pre>
<p>Dabei möchte ich nur nach jedem Zeilenumbruch eine neue Zeile haben.<br />
Die Leerzeichen sollen also wieder Leerzeichen werden.</p>
<p>Wie könnte ich das verhindern? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
In diesem Code sind für diese Frage wahrscheinlich nur die Funktion</p>
<pre><code class="language-cpp">bool schreibeDatei()
</code></pre>
<p>von Zeile 72 bis 104 interessant.</p>
<pre><code class="language-cpp">class person{
  public:
    void setVorname(string &amp; sVar) { sVorname = sVar; }
    void setNachname(string &amp; sVar ) { sNachname = sVar; }
    string getVorname() const { return sVorname; }
    string getNachname() const { return sNachname; }
  private:
    string sVorname;
    string sNachname;
};

// globaler Personenvektor
vector &lt;person&gt; g_personenVektor;

string leseDatei()
{
    string sAusgelesen = &quot;&quot;;
    ifstream eingangsdatei(&quot;daten_personen_1&quot;);

    if (!eingangsdatei)
        cout &lt;&lt; &quot; wurde nicht gefunden.&quot; &lt;&lt; endl;
    else
    {
        char c;
        while ( eingangsdatei.get(c) )
            sAusgelesen += c;

        if ( !eingangsdatei.eof() )
        {
            cout &lt;&lt; &quot;Da stimmt was nicht!&quot; &lt;&lt; endl;
            sAusgelesen = &quot;&quot;;
        }

        eingangsdatei.close();
    }
    return sAusgelesen;
}

/*
    Benutzt den uebergebenen String um den PersonenVektor mit 
    einzelen Personen zu fuellen
*/
void fuellePersonenVektor(string &amp; sDatei)
{
    person einePerson;
    string::size_type i1;         // Position in einem String
    while ( not sDatei.empty() )  // Solange der String nicht leer ist
    {
        i1 = sDatei.find(&quot;;&quot;);
        if ( i1 &gt; 0 &amp;&amp; i1 &lt; sDatei.length() )
        {
            string s(sDatei, 0, i1);
            cout &lt;&lt; s &lt;&lt; endl;
            einePerson.setVorname(s);
        }
        sDatei.erase(0, i1+1);

        i1 = sDatei.find(&quot;;&quot;);
        if ( i1 &gt; 0 &amp;&amp; i1 &lt; sDatei.length() )
        {
            string s(sDatei, 0, i1);
            cout &lt;&lt; s &lt;&lt; endl;
            einePerson.setNachname(s);
        }
        sDatei.erase(0, i1+1);

        g_personenVektor.push_back(einePerson);
    }
}

/* Schreibt den Inhalt des PersonenVektors in eine Datei */
bool schreibeDatei()
{
    ostringstream aout(&quot;&quot;);
    ofstream ausgangsdatei;
    ausgangsdatei.open(&quot;daten_personen_2&quot;);

    vector&lt;person&gt;::iterator iter = g_personenVektor.begin();

    /* Beginn relevanter Teil
    -----------------------------------------------------------------------*/
    while ( iter != g_personenVektor.end() )
    {
        aout &lt;&lt; iter-&gt;getVorname() &lt;&lt; &quot;;&quot;
             &lt;&lt; iter-&gt;getNachname() &lt;&lt; &quot;;&quot; &lt;&lt; endl;
        ++iter;
    }

    istringstream ain(aout.str());

    string a;
    while(true)
    {
        ain &gt;&gt; a;

        if (ain.eof())
            break;
        ausgangsdatei &lt;&lt; a &lt;&lt; endl;
    }
    /*
    ----------------------------------------------------------------------
    Ende relevanter Teil */
    return true;
}

int main()
{
    person einePerson;
    string sDatei = leseDatei(); // komplette Datei wird in einen String gespeichert
    /*  Laengenbegrenzung:
        sDatei.max_size()

        F R A G E: Wie koennte man zu groesse Dateien ermitteln, um sie danach aufzuteilen???
    */
    fuellePersonenVektor(sDatei);
    if ( not schreibeDatei() )
        cout &lt;&lt; &quot;Schreiben misslungen\n&quot;;
    return 0;
}
</code></pre>
<p>Noch ein Hinweis:<br />
Sämtliche Kombinationen der &quot;endl&quot;-Zeichen von Zeile 85 und 98 habe ich schon ausprobiert und führten nicht zum gewünschten Ergebnis.</p>
<p>So und nun bin ich mal auf eure Antworten gespannt<br />
<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 />
und herzlichen Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187224/stringstreams-bei-leerzeichen-zeilenumbruch-verhindern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 14:37:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187224.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jul 2007 10:55:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stringstreams, bei Leerzeichen Zeilenumbruch verhindern on Tue, 17 Jul 2007 11:32:26 GMT]]></title><description><![CDATA[<p>Hallo, ich habe ein kleines Problem.<br />
Ich will aus einer Textdatei, wie z.B. dieser hier: (daten_personen_1)</p>
<pre><code>Jonathan Tobias;Schulze;
Gabriel;Meier Müller;
</code></pre>
<p>die einzelnen Felder auslesen (getrennt durch ein Semikolon), im Programm weiterverarbeiten und anschließend wieder in dem selben Format in eine andere Datei schreiben. Hier ergibt sich allerdings das Problem, dass ich bei jedem Leerzeichen ein Zeilenumbruch habe, wie folgende Datei zeigt: (daten_personen_2)</p>
<pre><code>Jonathan
Tobias;Schulze;
Gabriel;Meier
Müller;
</code></pre>
<p>Dabei möchte ich nur nach jedem Zeilenumbruch eine neue Zeile haben.<br />
Die Leerzeichen sollen also wieder Leerzeichen werden.</p>
<p>Wie könnte ich das verhindern? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
In diesem Code sind für diese Frage wahrscheinlich nur die Funktion</p>
<pre><code class="language-cpp">bool schreibeDatei()
</code></pre>
<p>von Zeile 72 bis 104 interessant.</p>
<pre><code class="language-cpp">class person{
  public:
    void setVorname(string &amp; sVar) { sVorname = sVar; }
    void setNachname(string &amp; sVar ) { sNachname = sVar; }
    string getVorname() const { return sVorname; }
    string getNachname() const { return sNachname; }
  private:
    string sVorname;
    string sNachname;
};

// globaler Personenvektor
vector &lt;person&gt; g_personenVektor;

string leseDatei()
{
    string sAusgelesen = &quot;&quot;;
    ifstream eingangsdatei(&quot;daten_personen_1&quot;);

    if (!eingangsdatei)
        cout &lt;&lt; &quot; wurde nicht gefunden.&quot; &lt;&lt; endl;
    else
    {
        char c;
        while ( eingangsdatei.get(c) )
            sAusgelesen += c;

        if ( !eingangsdatei.eof() )
        {
            cout &lt;&lt; &quot;Da stimmt was nicht!&quot; &lt;&lt; endl;
            sAusgelesen = &quot;&quot;;
        }

        eingangsdatei.close();
    }
    return sAusgelesen;
}

/*
    Benutzt den uebergebenen String um den PersonenVektor mit 
    einzelen Personen zu fuellen
*/
void fuellePersonenVektor(string &amp; sDatei)
{
    person einePerson;
    string::size_type i1;         // Position in einem String
    while ( not sDatei.empty() )  // Solange der String nicht leer ist
    {
        i1 = sDatei.find(&quot;;&quot;);
        if ( i1 &gt; 0 &amp;&amp; i1 &lt; sDatei.length() )
        {
            string s(sDatei, 0, i1);
            cout &lt;&lt; s &lt;&lt; endl;
            einePerson.setVorname(s);
        }
        sDatei.erase(0, i1+1);

        i1 = sDatei.find(&quot;;&quot;);
        if ( i1 &gt; 0 &amp;&amp; i1 &lt; sDatei.length() )
        {
            string s(sDatei, 0, i1);
            cout &lt;&lt; s &lt;&lt; endl;
            einePerson.setNachname(s);
        }
        sDatei.erase(0, i1+1);

        g_personenVektor.push_back(einePerson);
    }
}

/* Schreibt den Inhalt des PersonenVektors in eine Datei */
bool schreibeDatei()
{
    ostringstream aout(&quot;&quot;);
    ofstream ausgangsdatei;
    ausgangsdatei.open(&quot;daten_personen_2&quot;);

    vector&lt;person&gt;::iterator iter = g_personenVektor.begin();

    /* Beginn relevanter Teil
    -----------------------------------------------------------------------*/
    while ( iter != g_personenVektor.end() )
    {
        aout &lt;&lt; iter-&gt;getVorname() &lt;&lt; &quot;;&quot;
             &lt;&lt; iter-&gt;getNachname() &lt;&lt; &quot;;&quot; &lt;&lt; endl;
        ++iter;
    }

    istringstream ain(aout.str());

    string a;
    while(true)
    {
        ain &gt;&gt; a;

        if (ain.eof())
            break;
        ausgangsdatei &lt;&lt; a &lt;&lt; endl;
    }
    /*
    ----------------------------------------------------------------------
    Ende relevanter Teil */
    return true;
}

int main()
{
    person einePerson;
    string sDatei = leseDatei(); // komplette Datei wird in einen String gespeichert
    /*  Laengenbegrenzung:
        sDatei.max_size()

        F R A G E: Wie koennte man zu groesse Dateien ermitteln, um sie danach aufzuteilen???
    */
    fuellePersonenVektor(sDatei);
    if ( not schreibeDatei() )
        cout &lt;&lt; &quot;Schreiben misslungen\n&quot;;
    return 0;
}
</code></pre>
<p>Noch ein Hinweis:<br />
Sämtliche Kombinationen der &quot;endl&quot;-Zeichen von Zeile 85 und 98 habe ich schon ausprobiert und führten nicht zum gewünschten Ergebnis.</p>
<p>So und nun bin ich mal auf eure Antworten gespannt<br />
<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 />
und herzlichen Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327130</guid><dc:creator><![CDATA[blueheart]]></dc:creator><pubDate>Tue, 17 Jul 2007 11:32:26 GMT</pubDate></item><item><title><![CDATA[Reply to stringstreams, bei Leerzeichen Zeilenumbruch verhindern on Tue, 17 Jul 2007 11:04:26 GMT]]></title><description><![CDATA[<p>Erstens: Was hat dieser Beitrag mit Stringstreams zu tun?</p>
<p>Zweitens: Vielleicht solltest du mal im Debugger verfolgen, wo genau die Newlines sich in deine Namen eingeschmuggelt haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327135</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Jul 2007 11:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to stringstreams, bei Leerzeichen Zeilenumbruch verhindern on Tue, 17 Jul 2007 11:28:26 GMT]]></title><description><![CDATA[<p>Vielleicht wird mit diesem Code das Problem ersichtlicher.<br />
In den ostringstream jeweils ein Wort oder zwei Wörter getrennt durch ein Leerzeichen</p>
<pre><code class="language-cpp">int main()
{
    ostringstream aout(&quot;&quot;);
    aout &lt;&lt; &quot;Ich weiss&quot; &lt;&lt; endl;
    aout &lt;&lt; &quot;nicht&quot; &lt;&lt; endl;
    aout &lt;&lt; &quot;mehr weiter.&quot; &lt;&lt; endl;

    istringstream ain(aout.str());

    string u;
    while (1)
    {
        ain &gt;&gt; u;
        if (ain.eof())
            break;
        cout &lt;&lt; u &lt;&lt; endl;
    }
}
</code></pre>
<p>wobei es dann zu folgender Ausgabe kommt:</p>
<pre><code>Ich
weiss
nicht
mehr
weiter.
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a><br />
1. Was ist das denn sonst, wenn es keine Stringstreams sind?<br />
2. Debugger hat mir leider nicht weitergeholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327157</guid><dc:creator><![CDATA[blueheart]]></dc:creator><pubDate>Tue, 17 Jul 2007 11:28:26 GMT</pubDate></item><item><title><![CDATA[Reply to stringstreams, bei Leerzeichen Zeilenumbruch verhindern on Tue, 17 Jul 2007 11:33:55 GMT]]></title><description><![CDATA[<p>Erstens: Du hast den Stringstream wirklich gut versteckt <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="😉"
    /> (und nebenbei betrifft dieses Phänomen ALLE IO-Streams - genauer: die istream-Familie)</p>
<p>Zweitens: operator&gt;&gt; liest bis zum ersten Whitespace (Leerzeichen, Tab, NewLine) ein. Wenn du etwas anderes als Trennzeichen verwenden willst, kannst du getline() verwenden - das liest soweit, bis es das angegebene Endezeichen (Default ist '\n') findet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327159</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Jul 2007 11:33:55 GMT</pubDate></item></channel></rss>