<?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[Line feed (Multiplattform) und ein zeilenweises Einlesen]]></title><description><![CDATA[<p>EDIT::UPS, falsches Forum, bitte nach C++ verschieben...</p>
<p>Hallo zusammen,</p>
<p>ich habe Textdateien, welche von unterschiedlichen Plattformen (Unix, Windows, Mac) stammen, welche ich gerne Zeilenweise einlesen möchte. Meine erste Lösung sah so aus</p>
<pre><code class="language-cpp">sourcefile.open(myfile.c_str(),ios_base::in);
string tmp;
vector&lt;string&gt; LineFile;
while (getline(sourcefile,tmp))
{
	LineFile.push_back(tmp);
}
sourcefile.close();
</code></pre>
<p>aber getline scheint als Delimiter standardmässig &quot;\n&quot; zu verwenden, was unter Windows &quot;\r\n&quot; und Unix &quot;\n&quot; Systemen kein Problem ist, aber auf dem Mac wird mit &quot;\r&quot; abgeschlossen. Die zweite Fassung mit</p>
<pre><code class="language-cpp">sourcefile.open(myfile.c_str(),ios_base::in);
string tmp;
vector&lt;string&gt; LineFile;
while (getline(sourcefile,tmp,'\r'))
{
	LineFile.push_back(tmp);
}
sourcefile.close();
</code></pre>
<p>führt auf dem Mac und Windows zum Erfolg, aber Unix bleibt außen vor <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>Eine Lösung gibt es doch wahrscheinlich - jemand eine Idee ?</p>
<p>Winn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191300/line-feed-multiplattform-und-ein-zeilenweises-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 03:38:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191300.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Sep 2007 12:39:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sat, 01 Sep 2007 12:42:50 GMT]]></title><description><![CDATA[<p>EDIT::UPS, falsches Forum, bitte nach C++ verschieben...</p>
<p>Hallo zusammen,</p>
<p>ich habe Textdateien, welche von unterschiedlichen Plattformen (Unix, Windows, Mac) stammen, welche ich gerne Zeilenweise einlesen möchte. Meine erste Lösung sah so aus</p>
<pre><code class="language-cpp">sourcefile.open(myfile.c_str(),ios_base::in);
string tmp;
vector&lt;string&gt; LineFile;
while (getline(sourcefile,tmp))
{
	LineFile.push_back(tmp);
}
sourcefile.close();
</code></pre>
<p>aber getline scheint als Delimiter standardmässig &quot;\n&quot; zu verwenden, was unter Windows &quot;\r\n&quot; und Unix &quot;\n&quot; Systemen kein Problem ist, aber auf dem Mac wird mit &quot;\r&quot; abgeschlossen. Die zweite Fassung mit</p>
<pre><code class="language-cpp">sourcefile.open(myfile.c_str(),ios_base::in);
string tmp;
vector&lt;string&gt; LineFile;
while (getline(sourcefile,tmp,'\r'))
{
	LineFile.push_back(tmp);
}
sourcefile.close();
</code></pre>
<p>führt auf dem Mac und Windows zum Erfolg, aber Unix bleibt außen vor <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>Eine Lösung gibt es doch wahrscheinlich - jemand eine Idee ?</p>
<p>Winn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356758</guid><dc:creator><![CDATA[Winn]]></dc:creator><pubDate>Sat, 01 Sep 2007 12:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sat, 01 Sep 2007 13:35:32 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-18363.html" rel="nofollow">Jochen Kalmbach</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-58.html" rel="nofollow">C++/CLI mit .NET</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356800</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Sat, 01 Sep 2007 13:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sat, 01 Sep 2007 13:38:08 GMT]]></title><description><![CDATA[<p>Ich weiß nicht, ob's da eine fertige Lösung für gibt, zur Not musst du es eben selber machen... Einfach bis '\r' <em>oder</em> '\n' einlesen, das Gelesene als neue Zeile abspeichern und alle folgenden '\r' und '\n'-Zeichen überspringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1356803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1356803</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 01 Sep 2007 13:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sat, 01 Sep 2007 21:55:02 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich weiß nicht, ob's da eine fertige Lösung für gibt, zur Not musst du es eben selber machen... Einfach bis '\r' <em>oder</em> '\n' einlesen, das Gelesene als neue Zeile abspeichern und alle folgenden '\r' und '\n'-Zeichen überspringen.</p>
</blockquote>
<p>Das würde natürlich gehen... performant wäre es aber wahrscheinlich nicht. Kann man denn davon ausgehen, dass wenn eine datei im unix format auf einer windows maschine geöffnet und bearbeitet wird, diese datei auch wieder den windows typischen line feed in der gesamten datei bekommt ? dann würde ich die erste zweite dritte zeile nach dem line feed scannen und anschließend mit getline über die datei huschen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357083</guid><dc:creator><![CDATA[Winn]]></dc:creator><pubDate>Sat, 01 Sep 2007 21:55:02 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sat, 01 Sep 2007 22:17:49 GMT]]></title><description><![CDATA[<p>Winn schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Ich weiß nicht, ob's da eine fertige Lösung für gibt, zur Not musst du es eben selber machen... Einfach bis '\r' <em>oder</em> '\n' einlesen, das Gelesene als neue Zeile abspeichern und alle folgenden '\r' und '\n'-Zeichen überspringen.</p>
</blockquote>
<p>Das würde natürlich gehen... performant wäre es aber wahrscheinlich nicht.</p>
</blockquote>
<p>Naja, irgendwie muss das die STL ja auch machen <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>Winn schrieb:</p>
<blockquote>
<p>Kann man denn davon ausgehen, dass wenn eine datei im unix format auf einer windows maschine geöffnet und bearbeitet wird, diese datei auch wieder den windows typischen line feed in der gesamten datei bekommt ?</p>
</blockquote>
<p>Wenn du die Datei mit dem Win-Editor öffnest, ist das bestimmt so. Ich würde sie aber so lassen wie sie ist; sie könnte von einem anderen Programm schreibend geöffnet sein, so dass du nicht schreiben kannst, oder sie liegt in einem Verzeichnis, auf dass du keinen Schreibzugriff hast.<br />
Das Problem lässt sich sicherlich auch so lösen! Du könntest z.B. erstmal Byte für Byte einlesen, bis du auf '\r' oder '\n' stößt. Ist es ein '\r' und kommt danach kein '\n', ist es die Mac-Version, folgt ein '\n', ist es Windows. Gibt's gar kein '\r', ist es wohl Linux <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/1357092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357092</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 01 Sep 2007 22:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sat, 01 Sep 2007 22:26:06 GMT]]></title><description><![CDATA[<p>ganz kranke idee:</p>
<p>Du könntest die datei auch in einen ganz großen string einlesen und dann mit boost::tokenizer bei \n oder \r trennen:</p>
<p>ich tipps jetzt ma nur ausm kopf, aber so soltle es gehen</p>
<pre><code class="language-cpp">std::string datei;
// datei einlesen

typedef boost::tokenizer&lt;boost::char_separator&lt;char&gt; &gt; tokenizer;
boost::char_separator&lt;char&gt; sep(&quot;\r\n&quot;);
tokenizer tokens(datei, sep);

for(tokenizer::iterator it = tokens.begin(); it != tokens.end(); ++it)
  cout &lt;&lt; *it &lt;&lt; endl;  // hier werden die einzelnen zeilen ausgegeben
</code></pre>
<p>Boost::tokenizer splittet nicht in einzelne tokens, wenn die beiden trenner aufeinander kommen, also wäre das genau das was du brauchst. Wie das mit der performance ist weiß ich nicht. Und du musst die ganze datei ja in den speicher laden. Wenn die zu groß is is auch nich so gut</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357096</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 01 Sep 2007 22:26:06 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 07:24:49 GMT]]></title><description><![CDATA[<p>hola</p>
<p>ne eigene getline version is ja nicht so gross:</p>
<pre><code class="language-cpp">bool isEndlineChar(char c)
{
   return c == '\n' || c == '\r';
}

std::istream&amp; getline_special(std::istream &amp;in, std::string &amp;str)
{
   std::streambuf *buf = in.rdbuf();
   int c;
   while(!isEndlineChar(c = buf-&gt;sbumpc()) &amp;&amp; c != EOF)
      str += static_cast&lt;char&gt;(c);
   if(c != EOF)
      while(isEndlineChar(buf-&gt;sgetc())) buf-&gt;sbumpc();
   return in;
}
</code></pre>
<p>habs nicht getestet, sollte aber funktionieren.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357135</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 02 Sep 2007 07:24:49 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 11:28:22 GMT]]></title><description><![CDATA[<p>Hm, werden dabei aber auch Leerzeilen erfasst? Oder macht das getline auch nicht? Man dürfte eigentlich maximal ein '\r' und ein '\n' überspringen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357218</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 02 Sep 2007 11:28:22 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 12:03:51 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Hm, werden dabei aber auch Leerzeilen erfasst? Oder macht das getline auch nicht? Man dürfte eigentlich maximal ein '\r' und ein '\n' überspringen..</p>
</blockquote>
<p>leere zeilen werden damit natuerlich eliminiert. um es konform zum std::getline zu machen, muesste man es noch anpassen. sollte aber kein problem darstellen.</p>
<p>EDIT:</p>
<pre><code class="language-cpp">bool isEndlineChar(char c)
{
   return c == '\n' || c == '\r';
}

std::istream&amp; getline_special(std::istream &amp;in, std::string &amp;str)
{
   std::streambuf *buf = in.rdbuf();
   int c;
   while(!isEndlineChar(c = buf-&gt;sbumpc()) &amp;&amp; c != EOF)
      str += static_cast&lt;char&gt;(c);
   if(c != EOF)
   {
      if(c == '\r')
         if(buf-&gt;snextc() == '\n')
            buf-&gt;sbumpc();
   }
   return in;
}
</code></pre>
<p>so sollte es nun passen</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357240</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 02 Sep 2007 12:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 12:04:14 GMT]]></title><description><![CDATA[<p>Hm, habs mal probiert, die letzte Zeile wird aber nicht mehr dargestellt:</p>
<pre><code class="language-cpp">std::istream&amp; getline_special2(std::istream &amp;in, std::string &amp;str)
{
	str.clear();

	char c;
	while ( in.get(c) &amp;&amp; !isEndlineChar(c) )
		str.push_back( c );

	if ( c == '\r' )
		if ( in.peek() == '\n' )
			in.get(c);

   return in;
}

std::ifstream f( &quot;C:\\Test.txt&quot; );
std::string line;
while ( getline_special2(f,line) )
	std::cout &lt;&lt; line &lt;&lt; std::endl;
</code></pre>
<p>Ist ja auch logisch, weil der stream nicht mehr gültig ist nach dem Einlesen der letzten Zeile, aber wie macht das normale getline das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357242</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 02 Sep 2007 12:04:14 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 12:34:50 GMT]]></title><description><![CDATA[<p>vielleicht so:</p>
<pre><code class="language-cpp">std::istream&amp; getline_special(std::istream &amp;in, std::string &amp;str)
{
   std::streambuf *buf = in.rdbuf();
   if(buf-&gt;sgetc() == EOF)
   {
      in.setstate(std::ios::eof);
      return in;
   }

   int c;
   while(!isEndlineChar(c = buf-&gt;sbumpc()) &amp;&amp; c != EOF)
      str += static_cast&lt;char&gt;(c);
   if(c != EOF)
   {
      if(c == '\r')
         if(buf-&gt;snextc() == '\n')
            buf-&gt;sbumpc();
   }
   return in;
}
</code></pre>
<p>beim ersten durchgang wird am ende kein eof-bit gesetzt, weil ich die einzelen bytes ueber streambuf lese. wenn dann nochmal aus dem istream gelesen werden soll, und man bekommt EOF zurueck, setzt man das EOF-bit und gibt den istream zurueck. hab leider keinen compiler bei der hand zum testen.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357267</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 02 Sep 2007 12:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 15:41:17 GMT]]></title><description><![CDATA[<p>Winn schrieb:</p>
<blockquote>
<p>ich habe Textdateien, welche von unterschiedlichen Plattformen (Unix, Windows, Mac) stammen, welche ich gerne Zeilenweise einlesen möchte.<br />
...<br />
aber getline scheint als Delimiter standardmässig &quot;\n&quot; zu verwenden, was unter Windows &quot;\r\n&quot; und Unix &quot;\n&quot; Systemen kein Problem ist, aber auf dem Mac wird mit &quot;\r&quot; abgeschlossen.</p>
</blockquote>
<p>Der C++-Standard stellt für Probleme dieser Art eine Facette codecvt&lt;&gt; zur Verfügung. Mal angenommen Deine Facette hieße</p>
<pre><code class="language-cpp">class EndOfLine : public std::codecvt&lt; char, char, std::mbstate_t &gt;
</code></pre>
<p>dann hängt man die mit</p>
<pre><code class="language-cpp">ifstream quelle( &quot;input.txt&quot; );
    quelle.imbue( locale( quelle.getloc(), new EndOfLine( Windows Unix oder Mac-Datei ) ) );
</code></pre>
<p>in den Stream ein. Bei ofstream das gleiche. In den protected Methoden do_in und do_out kannst Du dann die Konvertierung vornehmen.<br />
Du musst bloss aufpassen, dass Dein unterliegendes Dateisystem nicht schon eine Konvertierung vornimmt. Man kann das umgehen indem man die Dateien mit std::ios_base::binary öffnet.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357350</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 02 Sep 2007 15:41:17 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 16:06:18 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Du musst bloss aufpassen, dass Dein unterliegendes Dateisystem nicht schon eine Konvertierung vornimmt. Man kann das umgehen indem man die Dateien mit std::ios_base::binary öffnet.</p>
</blockquote>
<p>*erstaunt*<br />
Heißt das, dass das entsprechende OS schon konvertiert, wenn man eine Datei im Textmodus öffnet? Was macht es genau, weißt du noch mehr darüber? <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/1357361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357361</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 02 Sep 2007 16:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to Line feed (Multiplattform) und ein zeilenweises Einlesen on Sun, 02 Sep 2007 16:17:35 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Heißt das, dass das entsprechende OS schon konvertiert, wenn man eine Datei im Textmodus öffnet? Was macht es genau, weißt du noch mehr darüber? <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>
</blockquote>
<p>Also ganz konkret: Wenn man unter mit dem Visual Studio 8 einen Code schreibt, der eine Datei öffnet und die Zeichen einzeln einliest, so fehlt immer das '\r' vor dem '\n', wenn in der Datei selbst diese Folge steht.<br />
Umgekehrt wird beim Schreiben vor jedes '\n' ein '\r' eingefügt. Immer vorausgesetzt man öffnet die Datei nicht im binary-mode.<br />
Soweit ich das nachvollziehen kann, passiert diese Konvertierung jenseits des basic_filebuf&lt; char &gt;, und es gilt wohl gleichermaßen für C - also printf. Der Code dazu steckt irgendwo in der MS-C-Runtime-Library. Und ist damit wohl nicht Teil des OS.</p>
<p>Unix (also auch Linux) braucht nichts tun, '\n' bleibt '\n'. Wie es beim Mac ist, weiß ich nicht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1357369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1357369</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 02 Sep 2007 16:17:35 GMT</pubDate></item></channel></rss>