<?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[Letzten String innerhalb einer Datei auslesen]]></title><description><![CDATA[<p>Ich muss innerhalb einer Datei den letzten auftretenden String auslesen. Dazu habe ich eine Funktion geschrieben, die ans Ende der Datei springt und dann solange jeweils ein Zeichen einliest, bis ein Leerzeichen oder Tab gefunden wird. Leider funktioniert das Ganze nicht <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="🙄"
    /> . Die Zahlenwerte (Es treten in der einzulesenden Datei nur Zahlen auf) werden korrekt eingelesen. Kommt man an die Stelle des Tab, dann ändert sich der gespeicherte Wert nicht. Tab wird nicht erkannt.</p>
<p>Wie kann ich denn auf intelligente und schnelle Weise den letzten String auslesen?</p>
<p>Hier noch der Code der Funktion</p>
<pre><code class="language-cpp">/******************************************************************************
*	Bestimmung des letzten Strings innerhalb einer Datei
******************************************************************************/

//Öffnen des Eingangs- und des Ausgangsfiles
std::ifstream Datei;Datei.open(Filename);

//Sicherstellen, dass die Datei existiert
if (!Datei)	{return 1;}

//Variablen
unsigned int End_Pos = 0, akt_Pos = 0; 
char Zeichen = 3;
	´
//Bestimmung der Endposition
Datei.seekg (0, ios::end); End_Pos = Datei.tellg();
akt_Pos = End_Pos-2;

/********************************************************************
*	Schleife, die solange läuft, bis wir ein Trennzeichen
*	(Leerzeichen oder Tab) erwischen
*********************************************************************/

do
{
	//ein Zeichen zurück
	akt_Pos = akt_Pos-1; Datei.seekg(akt_Pos, ios::beg);

	if (akt_Pos &gt; End_Pos) {return 2;}

	//Auslesen des aktuellen Zeichens
	Datei &gt;&gt; Zeichen;
}
while  ((Zeichen != 32) || (Zeichen != 11) ||(Zeichen != 9));

//Nun lesen wir den letzten String aus
Datei &gt;&gt; Last_String; 

return 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/150650/letzten-string-innerhalb-einer-datei-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 20:29:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150650.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Jun 2006 07:16:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Letzten String innerhalb einer Datei auslesen on Mon, 19 Jun 2006 07:16:49 GMT]]></title><description><![CDATA[<p>Ich muss innerhalb einer Datei den letzten auftretenden String auslesen. Dazu habe ich eine Funktion geschrieben, die ans Ende der Datei springt und dann solange jeweils ein Zeichen einliest, bis ein Leerzeichen oder Tab gefunden wird. Leider funktioniert das Ganze nicht <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="🙄"
    /> . Die Zahlenwerte (Es treten in der einzulesenden Datei nur Zahlen auf) werden korrekt eingelesen. Kommt man an die Stelle des Tab, dann ändert sich der gespeicherte Wert nicht. Tab wird nicht erkannt.</p>
<p>Wie kann ich denn auf intelligente und schnelle Weise den letzten String auslesen?</p>
<p>Hier noch der Code der Funktion</p>
<pre><code class="language-cpp">/******************************************************************************
*	Bestimmung des letzten Strings innerhalb einer Datei
******************************************************************************/

//Öffnen des Eingangs- und des Ausgangsfiles
std::ifstream Datei;Datei.open(Filename);

//Sicherstellen, dass die Datei existiert
if (!Datei)	{return 1;}

//Variablen
unsigned int End_Pos = 0, akt_Pos = 0; 
char Zeichen = 3;
	´
//Bestimmung der Endposition
Datei.seekg (0, ios::end); End_Pos = Datei.tellg();
akt_Pos = End_Pos-2;

/********************************************************************
*	Schleife, die solange läuft, bis wir ein Trennzeichen
*	(Leerzeichen oder Tab) erwischen
*********************************************************************/

do
{
	//ein Zeichen zurück
	akt_Pos = akt_Pos-1; Datei.seekg(akt_Pos, ios::beg);

	if (akt_Pos &gt; End_Pos) {return 2;}

	//Auslesen des aktuellen Zeichens
	Datei &gt;&gt; Zeichen;
}
while  ((Zeichen != 32) || (Zeichen != 11) ||(Zeichen != 9));

//Nun lesen wir den letzten String aus
Datei &gt;&gt; Last_String; 

return 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1080378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080378</guid><dc:creator><![CDATA[Redone]]></dc:creator><pubDate>Mon, 19 Jun 2006 07:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to Letzten String innerhalb einer Datei auslesen on Mon, 19 Jun 2006 07:33:48 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht ganz sicher, ob deine Konstanten stimmen - versuch's doch mal besser mit den Char-Literalen (' ', '\t', '\n') stattdessen. Oder noch besser, du jagst das gelesene Zeichen durch <a href="http://man.cx/isspace" rel="nofollow">man: isspace</a>.</p>
<p>(PS: Wieso liest du eigentlich deinen String doppelt ein? Du kannst doch in der do-while() Schleife schon alle gelesenen Zeichen im Ausgabestring sammeln)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080394</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 19 Jun 2006 07:33:48 GMT</pubDate></item><item><title><![CDATA[Reply to Letzten String innerhalb einer Datei auslesen on Mon, 19 Jun 2006 08:12:59 GMT]]></title><description><![CDATA[<p>Vielen Dank für Deine Antwort. Habe Deine Vorschläge getestet, komme aber leider nicht weiter. Das Problem liegt nicht in der Abfrage innerhalb der while-Schleife, sondern beim zeichenweisen Einlesen des Textes.</p>
<p>Habe zum Beispiel eine Textdatei mit folgendem Inhalt erzeugt.</p>
<p>311 232 5 7 9<br />
8 1 3 10</p>
<p>Im folgenden<br />
erhalte ich diese Werte im char:</p>
<p>Pos: 21 ==&gt; char: 0<br />
Pos: 20 ==&gt; char: 1<br />
Pos: 19 ==&gt; char: 3<br />
Pos: 18 ==&gt; char: 3<br />
Pos: 17 ==&gt; char: 1<br />
Pos: 16 ==&gt; char: 1</p>
<p>usw.</p>
<p>Ich müsste bei Position 19 bzw. Position 17 eigentlich das White Space bekommen. Kriege ich aber nicht <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="😞"
    /> . Warum auch immer. Dann kann ich natürlich hinten testen soviel ich will.</p>
<p>Ich habe keine Ahnung, was ich falsch mache???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1080412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080412</guid><dc:creator><![CDATA[Redone]]></dc:creator><pubDate>Mon, 19 Jun 2006 08:12:59 GMT</pubDate></item><item><title><![CDATA[Reply to Letzten String innerhalb einer Datei auslesen on Mon, 19 Jun 2006 08:17:03 GMT]]></title><description><![CDATA[<p>Ein Blick in die FAQ zeigt uns folgendes Beispiel:</p>
<pre><code class="language-cpp">using namespace std; 
ifstream FileIn(&quot;Main.cpp&quot;); 
if (FileIn)     // Falls FileIn gültig ist. 
{ 
    vector&lt;string&gt; Contents;              // Container für die einzelnen Zeilen 

    // Solange kein Fehler auftritt und nicht eof 
    for (string ReadString; getline(FileIn, ReadString); )         
        Contents.push_back(ReadString);   // Aktuelle Zeile in den Vektor einfügen 

    // Alle Elemente des Vektors ausgeben. 
    ostream_iterator&lt;string&gt; Out(cout, &quot;\n&quot;); 
    copy(Contents.begin(), Contents.end(), Out); 
}
</code></pre>
<p>Daraus machen wir dann einfach</p>
<pre><code class="language-cpp">using namespace std; 
ifstream FileIn(&quot;Main.cpp&quot;); 

if (FileIn)     // Falls FileIn gültig ist. 
{ 
    vector&lt;string&gt; Contents; // Container für die einzelnen Zeilen 

    // Solange kein Fehler auftritt und nicht eof 
    for (string ReadString; getline(FileIn, ReadString); )         
        Contents.push_back(ReadString);   // Aktuelle Zeile in den Vektor einfügen 

   cout&lt;&lt;Contents[Contents.size()-1]&lt;&lt;endl;
}
</code></pre>
<p><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>// Mist, hab letzte Zeile anstatt letzten String gelesen. Egal, dann musst du einfach die Methode find_last_of(' ') beim letzten VectorElement aufrufen und du hast die Position. Bzw. der letzte String wäre dann</p>
<pre><code class="language-cpp">string letzteZeile = Contents[Contents.size()-1];
string letzterString = letzteZeile.substr( letzteZeile.find_last_of(' '), letzteZeile.size() );
</code></pre>
<p>So ungefähr <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1080415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080415</guid><dc:creator><![CDATA[Delryn]]></dc:creator><pubDate>Mon, 19 Jun 2006 08:17:03 GMT</pubDate></item><item><title><![CDATA[Reply to Letzten String innerhalb einer Datei auslesen on Mon, 19 Jun 2006 08:18:02 GMT]]></title><description><![CDATA[<p>Ach so meinst du das. In dem Fall solltest du von op&gt;&gt; Abstand nehmen - der hat nämlich die (normalerweise nützliche) Eigenschaft, daß er whitespaces ganz einfach überliest. Als Lösung hast du zwei Möglichkeiten:</p>
<pre><code class="language-cpp">//a: get() verwenden:
do
{
    //ein Zeichen zurück
    akt_Pos = akt_Pos-1; Datei.seekg(akt_Pos, ios::beg);

    if (akt_Pos &gt; End_Pos) {return 2;}

    //Auslesen des aktuellen Zeichens
    Datei.get(Zeichen);
}
while (...);

//b: Whitespaces-Skipping ausschalten
Datei.unsetf(skipws);/*oder*/Datei&gt;&gt;noskipws;

do
{
    //ein Zeichen zurück
    akt_Pos = akt_Pos-1; Datei.seekg(akt_Pos, ios::beg);

    if (akt_Pos &gt; End_Pos) {return 2;}

    //Auslesen des aktuellen Zeichens
    Datei &gt;&gt; Zeichen;
}
while  (...)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1080418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080418</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 19 Jun 2006 08:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Letzten String innerhalb einer Datei auslesen on Mon, 19 Jun 2006 08:36:35 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a> and Delryn</p>
<p>Vielen Dank für die Antworten. Habe die Variante a) von CStoll verwendet (war am einfachsten *g), jetzt funzt es und ich habe auch noch was gelernt, vieleicht lässt mich mein Chef dann früher nach Hause.... <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/1080433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1080433</guid><dc:creator><![CDATA[Redone]]></dc:creator><pubDate>Mon, 19 Jun 2006 08:36:35 GMT</pubDate></item></channel></rss>