<?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[String bzw. Char &#x27;splitten&#x27;]]></title><description><![CDATA[<p>Hallo @ all,</p>
<p>ich habe leider das &quot;kleine&quot; Problem das ich es einfach nicht schaffe einen Text zu splitten und anschließend in die Klassen zu transportieren.</p>
<p>Meine Frage wäre mal vorne weg, ist es einfacher bzw. besser einen char zu splitten oder einen string?</p>
<pre><code>void TravelAgency::readFile() {
    // SAMPLE: F|70|1499.0|20150104|20150109|FRA|ORD|United Airlines
    fstream datei;
    char zeile[256];
    string stringzeile;

    datei.open(&quot;bookings.txt&quot;, ios::in);

    string trennung_(&quot;|&quot;);
    while (!datei.eof())
    {
        datei.getline(zeile, sizeof(zeile));
        stringzeile = charToString(zeile);     // die Attribute in den Klassen sind entweder ein String oder Integer..
        cout &lt;&lt; stringzeile &lt;&lt; endl;
    }
    cout &lt;&lt; &quot;Textdatei erfolgreich eingelesen&quot; &lt;&lt; endl;
    datei.close();
}

string TravelAgency::charToString(char toString[]){
    stringstream ss;
    string isString;
    ss &lt;&lt; toString;
    ss &gt;&gt; isString;
    return isString;
}
</code></pre>
<p>Wenn ich es nur hinkriegen würde anhand des Zeichens ('|') den String bzw. Charkette zu splitten wäre der Rest nun ein Kinderspiel.</p>
<p>Falls möglich nicht explizit die Lösung verraten sondern ich würde es gerne selber versuchen, damit es auch hängen bleibt <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>Danke im Vorrauuuuuus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334929/string-bzw-char-splitten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 02:30:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334929.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Oct 2015 15:48:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String bzw. Char &#x27;splitten&#x27; on Tue, 20 Oct 2015 15:48:52 GMT]]></title><description><![CDATA[<p>Hallo @ all,</p>
<p>ich habe leider das &quot;kleine&quot; Problem das ich es einfach nicht schaffe einen Text zu splitten und anschließend in die Klassen zu transportieren.</p>
<p>Meine Frage wäre mal vorne weg, ist es einfacher bzw. besser einen char zu splitten oder einen string?</p>
<pre><code>void TravelAgency::readFile() {
    // SAMPLE: F|70|1499.0|20150104|20150109|FRA|ORD|United Airlines
    fstream datei;
    char zeile[256];
    string stringzeile;

    datei.open(&quot;bookings.txt&quot;, ios::in);

    string trennung_(&quot;|&quot;);
    while (!datei.eof())
    {
        datei.getline(zeile, sizeof(zeile));
        stringzeile = charToString(zeile);     // die Attribute in den Klassen sind entweder ein String oder Integer..
        cout &lt;&lt; stringzeile &lt;&lt; endl;
    }
    cout &lt;&lt; &quot;Textdatei erfolgreich eingelesen&quot; &lt;&lt; endl;
    datei.close();
}

string TravelAgency::charToString(char toString[]){
    stringstream ss;
    string isString;
    ss &lt;&lt; toString;
    ss &gt;&gt; isString;
    return isString;
}
</code></pre>
<p>Wenn ich es nur hinkriegen würde anhand des Zeichens ('|') den String bzw. Charkette zu splitten wäre der Rest nun ein Kinderspiel.</p>
<p>Falls möglich nicht explizit die Lösung verraten sondern ich würde es gerne selber versuchen, damit es auch hängen bleibt <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>Danke im Vorrauuuuuus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471808</guid><dc:creator><![CDATA[depream]]></dc:creator><pubDate>Tue, 20 Oct 2015 15:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to String bzw. Char &#x27;splitten&#x27; on Tue, 20 Oct 2015 16:09:27 GMT]]></title><description><![CDATA[<p>Naja, du brauchst halt eine split-Hilfsfunktion, welche die Trennzeichen sucht und dann die einzelnen Strings extrahiert und in einen vector o.ä. stopft. Auf einzelne Zeichen greifst du mit operator[] zu (kannst auch find() benutzen), einen Teilstring erstellst du mit substr().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471811</guid><dc:creator><![CDATA[dasdasdasd]]></dc:creator><pubDate>Tue, 20 Oct 2015 16:09:27 GMT</pubDate></item><item><title><![CDATA[Reply to String bzw. Char &#x27;splitten&#x27; on Tue, 20 Oct 2015 16:17:36 GMT]]></title><description><![CDATA[<p>Darüber hinaus sieht das Einlesen doch ein wenig merkwürdig aus. Die Abbruchbedingung ist jedenfalls nicht richtig (getline kann fehlschlagen) und das mit 256 recht willkürlich dimensionierte Array sieht auch suspekt aus. Soweit mir bekannt macht man zeilenweises Einlesen in C++ üblicherweise so:</p>
<pre><code>ifstream datei(&quot;bookings.txt&quot;);
string zeile;
while (getline(datei,zeile))
{
    cout &lt;&lt; zeile &lt;&lt; endl;
}
cout &lt;&lt; &quot;Textdatei erfolgreich eingelesen&quot; &lt;&lt; endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2471814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471814</guid><dc:creator><![CDATA[gdfasgasfasd]]></dc:creator><pubDate>Tue, 20 Oct 2015 16:17:36 GMT</pubDate></item><item><title><![CDATA[Reply to String bzw. Char &#x27;splitten&#x27; on Tue, 20 Oct 2015 16:59:23 GMT]]></title><description><![CDATA[<p>Mit getline kann man auch splitten:</p>
<pre><code class="language-cpp">fstream datei(&quot;bookings.txt&quot;);
string data;
while (getline(datei, data, '|'))
{
    cout &lt;&lt; data &lt;&lt; '|';
}
cout &lt;&lt; &quot;Textdatei erfolgreich eingelesen&quot; &lt;&lt; endl;
</code></pre>
<p>Und am besten mal ein paar Beiträge von &quot;Werner Salomon&quot; hier im Forum anschauen, z.B. <a href="https://www.c-plusplus.net/forum/p2465876#2465876">CSS ähnliche Text-Datei parsen</a> oder <a href="https://www.c-plusplus.net/forum/p2456393#2456393">[Hilfe] .csv zu .xml</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471820</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 20 Oct 2015 16:59:23 GMT</pubDate></item><item><title><![CDATA[Reply to String bzw. Char &#x27;splitten&#x27; on Tue, 20 Oct 2015 18:25:44 GMT]]></title><description><![CDATA[<p>Ich habe es mal etwas verbessert nur komme ich in eine Endlosschleife.</p>
<pre><code>void TravelAgency::readFile() {
    ifstream data(&quot;bookings.txt&quot;);
    string line;
    while (getline(data, line)) {

        TravelAgency::splitter(line);
    }
}

void TravelAgency::splitter(string line_){
    string symbol (&quot;|&quot;);
    size_t pos;
    string substring;
    int length_;

    while(line_ != &quot;\n&quot;){                    // Solange line_ nicht gleich &quot;Enter&quot; ist
        length_ = line_.length();            // Länge des Strings
        pos = line_.find(symbol);            // Finde Position vom Symbol
        substring = line_.substr(0,pos);     // Anfang bis Position = Substring
        line_ = line_.substr(pos+1, length_);// line_ ist ab nun ab der Position bis zum Ende der &quot;Zeile&quot;
        cout &lt;&lt; substring &lt;&lt; endl;
    }
}
</code></pre>
<p>Textdokument:</p>
<pre><code>F|70|1499.0|20150104|20150109|FRA|ORD|United Airlines
R|71|466.0|20150104|20150109|Chicago OHare Intl Airport|Chicago OHare Intl Airport|Avis
H|72|501.03|20150104|20150109|Mark Twain Hotel|Peoria
F|73|1358.0|20150109|20150110|ORD|FRA|United Airlines
F|74|330.0|20150608|20150608|STR|CDG|Air France
</code></pre>
<p>Meine Ausgabe:</p>
<pre><code>United Airlines
United Airlines
...
</code></pre>
<p>Mein Ziel war es immer bis zum Symbol einen substring zu &quot;erstellen&quot; und den Rest - natürlich ohne das Symbol am Anfang - als neue line_ zu haben, damit er den so lange zerlegt bis ich nur noch das &quot;Enter&quot; habe.</p>
<p>Ich hoffe das mein Ansatz überhaupt richtig ist <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="😃"
    /></p>
<p>Danke bisher an alle die mir geholfen haben <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2471840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471840</guid><dc:creator><![CDATA[depream]]></dc:creator><pubDate>Tue, 20 Oct 2015 18:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to String bzw. Char &#x27;splitten&#x27; on Tue, 20 Oct 2015 18:50:21 GMT]]></title><description><![CDATA[<p>Deine Abbruchbedingung stimmt nicht. Der Fall das in <code>line_</code> nur noch ein Newline enthält kommt nie vor. Das Newline hat <code>getline</code> schon entfernt. Du müsstest mal einen Test einbauen ob dein <code>find(symbol)</code> überhaupt noch was findet, bevor du den Anfang des Strings löschen willst. Wenn <code>find()</code> nichts findet gibt es einen sehr großen Wert (<a href="http://en.cppreference.com/w/cpp/string/basic_string/npos" rel="nofollow">string::npos</a>) zurück. Dieser Wert +1 ist zu groß für den Datentyp, es gibt einen Overflow und wir sind wieder bei 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471849</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 20 Oct 2015 18:50:21 GMT</pubDate></item><item><title><![CDATA[Reply to String bzw. Char &#x27;splitten&#x27; on Tue, 20 Oct 2015 19:28:22 GMT]]></title><description><![CDATA[<p>Hallo depream,</p>
<p>depream schrieb:</p>
<blockquote>
<p>Meine Frage wäre mal vorne weg, ist es einfacher bzw. besser einen char zu splitten oder einen string?</p>
</blockquote>
<p>am besten weder noch!</p>
<p>Was vielen Leuten nicht bewusst ist; es gibt in C++ einen std::istream in Form z.B. von cin oder ifstream. Und die Aufgabe dieses Streams ist es NICHT(nur) Zeichen aus einer Datei in den Speicher zu schaufeln - das könnte ein std::streambuf auch ganz allein, sondern aus einer Folge von Zeichen ein Objekt zu machen. Ein Objekt kann ein Zeichen, ein Integer, ein Datum oder eine TravelAgency sein. Die Folge von Zeichen kann in einer Datei oder im Memory (als String) stehen. Es bleibt eine Folge von Zeichen und das Lesen einer kompletten Zeile aus der Datei in einen String verschiebt das Problem nur und löst praktisch nichts (ok - nicht viel, aber dazu vielleicht später).</p>
<p>Th69 hat das schon vorgemacht. Wobei ich noch einen Schritte weiter gehe und nicht nur Strings lesen, sondern gleich die Objekte.</p>
<p>Um z.B. ein Zeichen oder ein Integer zu lesen gibt es Funktionen in C++.</p>
<pre><code>ifstream datei(...);
    char c; // ein Zeichen
    datei &gt;&gt; c; // liest das Zeichen
    if( datei )
    {   // alles ok; usw.
</code></pre>
<p>In 'c' kann jetzt ein 'F' ein 'R' oder ein 'H' oder was anderes stehen.<br />
Für das lesen (und prüfen) des Trennzeichens hält C++ auch etwas bereit. Zunächst wie oben:</p>
<pre><code>char pipe_zeichen;
    datei &gt;&gt; pipe_zeichen;
    if( datei &amp;&amp; pipe_zeichen == '|' )
    {   // erst jetzt ist alles i.O.
</code></pre>
<p>Ein std::istream kann auch eine Funktion 'aufnehmen', die eine gewisse Manipulation vornimmt. Man nennt diese Funktion daher auch Manipulator. Sie muss folgende Signatur haben:</p>
<pre><code>std::istream&amp; 'name'( std::istream&amp; );
</code></pre>
<p>'name' ist irgendein Name natürlich ohne ''. Angenommen es gibt einen Manipulator <code>pipe</code> - also:</p>
<pre><code>std::istream&amp; pipe( std::istream&amp; );
</code></pre>
<p>dann kann man folgendes aufrufen:</p>
<pre><code>datei &gt;&gt; pipe;
</code></pre>
<p>Hier wird diese Funktion dann mit 'datei' als Parameter aufgerufen und die Implementierung von <code>pipe</code> muss eine Referenz auf 'datei' wieder zurückgeben.</p>
<pre><code>std::istream&amp; pipe( std::istream&amp; ) {
        char pipe_zeichen;
        in &gt;&gt; pipe_zeichen;
        if( in &amp;&amp; pipe_zeichen == '|' )
            return in; // alles gut
        in.setstate( std::ios_base::failbit ); // setzt das Fehlerbit im istream
        return in;
    }
</code></pre>
<p>eine fortgeschrittene Variante und weitere Tipps findest Du <a href="https://www.c-plusplus.net/forum/p2016220#2016220">als Char&lt;&gt; hier</a>.</p>
<p>Um die ersten beiden Objekte (Zeichen und Nummer) zu lesen reicht dann:</p>
<pre><code>char c;
    int nr; 
    datei &gt;&gt; c &gt;&gt; pipe &gt;&gt; nr;
    if( datei )
    {   // Erfolg
</code></pre>
<p>depream schrieb:</p>
<blockquote>
<p>Falls möglich nicht explizit die Lösung verraten sondern ich würde es gerne selber versuchen, damit es auch hängen bleibt</p>
</blockquote>
<p>dann versuche es mal selber weiter.</p>
<p>Noch eine Frage: In der 3. Zeile der Textdatei ist ein '|' weniger als in den anderen 4 Zeilen. Ist das ein Fehler oder können hinter dem zweiten Datum 'beliebig' viele Felder und damit '|'-Zeichen pro Datensatz kommen?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471864</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:28:22 GMT</pubDate></item></channel></rss>