<?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[ifstream::open: Schneller mit ios::binary?]]></title><description><![CDATA[<p>Hallo!</p>
<p>Kurze Frage: Ist das Öffnen einer Datei mit ios::binary schneller als ohne?<br />
Weiters würde mich interesssieren, ob auch seekg/tellg dadurch schneller sind.</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330118/ifstream-open-schneller-mit-ios-binary</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 14:39:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330118.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Dec 2014 21:16:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Mon, 22 Dec 2014 21:16:44 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Kurze Frage: Ist das Öffnen einer Datei mit ios::binary schneller als ohne?<br />
Weiters würde mich interesssieren, ob auch seekg/tellg dadurch schneller sind.</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434281</guid><dc:creator><![CDATA[Moly]]></dc:creator><pubDate>Mon, 22 Dec 2014 21:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Mon, 22 Dec 2014 21:31:55 GMT]]></title><description><![CDATA[<p>1. Spielt das eine Rolle? Wenn du eine Textdatei öffnest, lässt du ios::binary weg, ansonsten schreibst du das hin.</p>
<p>2. seekg und tellg müssen im Text-Modus nicht unbedingt unterstüzt werden. (Und im Binary-Modus ebenfalls nicht.)</p>
<p>3. Für Geschwindigkeit sind die iostreams sowieso nicht zu empfehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434284</guid><dc:creator><![CDATA[iospeed]]></dc:creator><pubDate>Mon, 22 Dec 2014 21:31:55 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Mon, 22 Dec 2014 21:37:52 GMT]]></title><description><![CDATA[<p>iospeed schrieb:</p>
<blockquote>
<p>1. Spielt das eine Rolle?</p>
</blockquote>
<p>Ja, weil ich bei einer rekursiven Dateienumeration jede Datei öffnen und die Größe bestimmen will.</p>
<p>iospeed schrieb:</p>
<blockquote>
<p>2. seekg und tellg müssen im Text-Modus nicht unbedingt unterstüzt werden. (Und im Binary-Modus ebenfalls nicht.)</p>
</blockquote>
<p>Oh echt? Wieso das? Im Textmodus mhm okay, aber im Binärmodus?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434285</guid><dc:creator><![CDATA[Moly]]></dc:creator><pubDate>Mon, 22 Dec 2014 21:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Mon, 22 Dec 2014 21:50:04 GMT]]></title><description><![CDATA[<p>iospeed schrieb:</p>
<blockquote>
<p>2. seekg und tellg müssen im Text-Modus nicht unbedingt unterstüzt werden. (Und im Binary-Modus ebenfalls nicht.)</p>
</blockquote>
<p>Unterstützt werden müssen sie schon, es gibt bloß den ausdrücklichen Hinweis, dass das Ergebnis vielleicht nicht das ist, was man erwartet. So ist beispielsweise das Ergebnis der tell-Funktionen beispielsweise nur dafür gedacht, um damit die seek-Funktionen aufzurufen und nicht - wie es gerne oft vorgemacht wird - um damit beispielsweise die Größe einer Datei zu bestimmen. Das gilt übrigens ebenso im Binarymodus für bestimmte Fälle (zum Beispiel insbesondere bei der Positionierung am Dateiende, um die es hier anscheinend geht).</p>
<p>Der Grund dafür ist eben gerade der, weshalb der Threadersteller vermutlich seine Frage stellt: seek und tell scannen <em>nicht</em> die ganze Datei nach Zeilenumbrüchen. Die arbeiten auf einer Ebene unterhalb des Streaminhalts.</p>
<blockquote>
<p>3. Für Geschwindigkeit sind die iostreams sowieso nicht zu empfehlen.</p>
</blockquote>
<p>Was aber zumindest bei Dateien ziemlich irrelevant ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434286</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 22 Dec 2014 21:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Mon, 22 Dec 2014 21:49:16 GMT]]></title><description><![CDATA[<p>Moly schrieb:</p>
<blockquote>
<p>iospeed schrieb:</p>
<blockquote>
<p>1. Spielt das eine Rolle?</p>
</blockquote>
<p>Ja, weil ich bei einer rekursiven Dateienumeration jede Datei öffnen und die Größe bestimmen will.</p>
</blockquote>
<p>Dann frag doch gleich danach, wie man die Größe einer Datei bestimmt, anstatt alle Leser zu verwirren, was die komische Frage soll. Dein Weg mit dem Öffnen, Ende suchen und dann Position ausgeben ist sowieso nicht richtig. Nutz einfach die Funktionen des Betriebssystems, das ist schnell und korrekt. Wenn Plattformunabhängigkeit wichtig sein sollte, gibt es die Funktion fstat auf so ziemlich jeder Plattform, die das Arbeiten mit Dateien unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434288</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 22 Dec 2014 21:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 07:27:00 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>So ist beispielsweise das Ergebnis der tell-Funktionen beispielsweise nur dafür gedacht, um damit die seek-Funktionen aufzurufen und nicht - wie es gerne oft vorgemacht wird - um damit beispielsweise die Größe einer Datei zu bestimmen. Das gilt übrigens ebenso im Binarymodus für bestimmte Fälle (zum Beispiel insbesondere bei der Positionierung am Dateiende, um die es hier anscheinend geht).</p>
</blockquote>
<p>Oh, verdammt. Tja, wird halt überall so gemacht (und hier <a href="http://stackoverflow.com/a/22986486/1884226" rel="nofollow">http://stackoverflow.com/a/22986486/1884226</a> steht, dass man sich unter Windows darauf verlassen kann..).</p>
<p>Aber dass man in Bytes springt (bin. mode) und ios::beg/cur/end korrekt sind, davon kann man schon ausgehen, oder?<br />
Und könnte man die Dateigröße dann nicht mit end - beg bekommen?</p>
<p>Warum ist das so kompliziert <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434309</guid><dc:creator><![CDATA[Moly]]></dc:creator><pubDate>Tue, 23 Dec 2014 07:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 07:37:14 GMT]]></title><description><![CDATA[<p>Moly schrieb:</p>
<blockquote>
<p>Warum ist das so kompliziert <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="😕"
    /></p>
</blockquote>
<p>Das ist gar nicht kompliziert.</p>
<p>Du hast Dich nur irgendwie verlaufen. Schau Dir die Funktion <code>stat</code> an. Der übergibst Du den Dateinamen und einen Zeiger auf eine stat-Struktur und sie liefert unter anderem die Dateigrösse. Und die Fehlerprüfung nicht vergessen!</p>
<p>So einfach ist das.</p>
<p>Mit ifstream ist es ineffizient und komplizierter. Wobei es auch nicht wirklich kompliziert ist. Datei öffnen (std::ifstream::open), auf das Ende positionieren (std::istream::seekg) und die Position auslesen (std::istream::tellg).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434310</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 23 Dec 2014 07:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 08:16:24 GMT]]></title><description><![CDATA[<p>SeppJ hat doch gerade 2x gesagt, dasss dies nicht korrekt ist <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="🙄"
    /></p>
<p>Ich finde es kompliziert, weil wozu hat man fstream, wenn man scheinbar nicht mal verlässlich die Dateigröße bestimmen kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434313</guid><dc:creator><![CDATA[Moly]]></dc:creator><pubDate>Tue, 23 Dec 2014 08:16:24 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 08:27:09 GMT]]></title><description><![CDATA[<p>Moly schrieb:</p>
<blockquote>
<p>SeppJ hat doch gerade 2x gesagt, dasss dies nicht korrekt ist <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="🙄"
    /></p>
<p>Ich finde es kompliziert, weil wozu hat man fstream, wenn man scheinbar nicht mal verlässlich die Dateigröße bestimmen kann...</p>
</blockquote>
<p>Wozu habe ich einen Hammer wenn ich noch nicht mal verlässlich eine Schraube damit eindrehen kann <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="🙄"
    /> .</p>
<p>Man hat fstream um Dateien zu lesen und zu schreiben. Es ist eben nicht dafür gedacht, die Dateigröße zu bestimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434316</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 23 Dec 2014 08:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 10:48:09 GMT]]></title><description><![CDATA[<p>Okay, aber um vernünftig lesen/schreiben zu können, muss man doch vom Anfang bis zum Ende springen können.<br />
Und die Differenz muss dann doch die Dateigröße sein (binary mode)?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434326</guid><dc:creator><![CDATA[Moly]]></dc:creator><pubDate>Tue, 23 Dec 2014 10:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 10:56:51 GMT]]></title><description><![CDATA[<p>Moly schrieb:</p>
<blockquote>
<p>Okay, aber um vernünftig lesen/schreiben zu können, muss man doch vom Anfang bis zum Ende springen können.</p>
</blockquote>
<p>Naja.</p>
<blockquote>
<p>Und die Differenz muss dann doch die Dateigröße sein (binary mode)?!</p>
</blockquote>
<p>Naja. Manche System unterstützen &quot;Löcher&quot; in Dateien, wenn man an Stellen außerhalb des Endes seeked. Andere System nicht. Es kann sein, dass die &quot;Löcher&quot; mitgezählt werden bei tellg(), oder nicht.</p>
<p>Was spricht gegen?</p>
<pre><code>long GetFileSize(std::string filename)
{
    struct stat stat_buf;
    int rc = stat(filename.c_str(), &amp;stat_buf);
    return rc == 0 ? stat_buf.st_size : -1;
}
</code></pre>
<p>(<a href="http://stackoverflow.com/a/6039648" rel="nofollow">http://stackoverflow.com/a/6039648</a>)<br />
Ist vermutlich schneller und muss die Datei nicht öffnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434327</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 23 Dec 2014 10:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 11:53:02 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>iospeed schrieb:</p>
<blockquote>
<p>2. seekg und tellg müssen im Text-Modus nicht unbedingt unterstüzt werden. (Und im Binary-Modus ebenfalls nicht.)</p>
</blockquote>
<p>Unterstützt werden müssen sie schon, es gibt bloß den ausdrücklichen Hinweis, dass das Ergebnis vielleicht nicht das ist, was man erwartet. So ist beispielsweise das Ergebnis der tell-Funktionen beispielsweise nur dafür gedacht, um damit die seek-Funktionen aufzurufen und nicht - wie es gerne oft vorgemacht wird - um damit beispielsweise die Größe einer Datei zu bestimmen.</p>
</blockquote>
<p>Da muss ich doch nochmal nachfragen. Wo steht, dass das Ergebnis der tellg-Funktion nicht dafür geeignet ist? Ich bin der Meinung, dass man mit seekg und tellg durchaus die Grösse der Datei herausfinden kann.</p>
<p>Wobei man natürlich fragen kann, was man wissen will. Die Grösse einer Datei ist nicht zwangsweise die Anzahl der Bytes, die im Dateisystem belegt werden. Es gibt Sparse-Dateien, die Lücken aufweise. Aber eigentlich sind diese Lücken für eine Applikation transparent.</p>
<p>PS: Ich habe mal ein sparsefile angelegt mit:</p>
<pre><code>dd if=/dev/zero of=sparsefile bs=1 count=0 seek=10M
</code></pre>
<p>Diesem Programm:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/stat.h&gt;
#include &lt;unistd.h&gt;

int main(int argc, char* argv[])
{
    struct stat st;
    stat(&quot;sparsefile&quot;, &amp;st);
    std::cout &lt;&lt; st.st_size &lt;&lt; ' ' &lt;&lt; st.st_blocks &lt;&lt; std::endl;

    std::ifstream f(&quot;sparsefile&quot;);
    f.seekg(0, std::ios_base::end);
    std::cout &lt;&lt; f.tellg() &lt;&lt; std::endl;
}
</code></pre>
<p>liefert dann:</p>
<pre><code>10485760 0
10485760
</code></pre>
<p>Also zumindest auf meinem System (Fedora mit ext4) liefert seekg/tellg die Dateigrösse. Wobei die Datei viel weniger Platz auf der Platte belegt (nämlich 0).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434332</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 23 Dec 2014 11:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 21:23:18 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>iospeed schrieb:</p>
<blockquote>
<p>2. seekg und tellg müssen im Text-Modus nicht unbedingt unterstüzt werden. (Und im Binary-Modus ebenfalls nicht.)</p>
</blockquote>
<p>Unterstützt werden müssen sie schon, es gibt bloß den ausdrücklichen Hinweis, dass das Ergebnis vielleicht nicht das ist, was man erwartet. So ist beispielsweise das Ergebnis der tell-Funktionen beispielsweise nur dafür gedacht, um damit die seek-Funktionen aufzurufen und nicht - wie es gerne oft vorgemacht wird - um damit beispielsweise die Größe einer Datei zu bestimmen.</p>
</blockquote>
<p>Da muss ich doch nochmal nachfragen. Wo steht, dass das Ergebnis der tellg-Funktion nicht dafür geeignet ist? Ich bin der Meinung, dass man mit seekg und tellg durchaus die Grösse der Datei herausfinden kann.</p>
</blockquote>
<p>Im Standard natürlich. Dieser verweist über 5 Ecken auf den C-Standard und dieser wiederum gibt auf 5 verschiedene Stellen verteilt das wieder, was hier im Thread schon gesagt wurde.</p>
<p>Kurzwiedergabe:<br />
fseek ans Ende muss nicht notwendigerweise genau ans Ende springen. Da kann beispielsweise Padding am Ende sein.<br />
ftell am Ende gibt für Binärstreams zwar tatsächlich die Dateigröße an, aber wegen obigem Punkt ist man nicht garantiert am Ende, sondern vielleicht dahinter.<br />
Und für Textstreams haben die Werte natürlich überhaupt nichts mit der Zahl der lesbaren Zeichen zu tun.</p>
<blockquote>
<p>Also zumindest <strong>auf meinem System</strong> (Fedora mit ext4) liefert seekg/tellg die Dateigrösse.</p>
</blockquote>
<p>Den wichtigen Teil habe ich markiert. Unter POSIXen kannst du dich da drauf verlassen, dass das tatsächlich funktioniert, weil dies weitere Spezifikationen macht. Unter Windows wird's schon heikler. Und wer weiß, was andere exotische Systeme machen?<br />
Und in jedem Fall ist das Öffnen der Datei überhaupt nötig oder gar eine gute Idee, um deren Größe heraus zu finden. Was ist, wenn die Datei gelockt ist oder du keine Leserechte hast? Gibt dein Programm dann auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434438</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 23 Dec 2014 21:23:18 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 21:31:28 GMT]]></title><description><![CDATA[<p>Danke an alle.<br />
stat (_wstat64) ist sogar am schnellsten, obwohl da ziemlich viele Informationen ausgelesen werden.<br />
(GetFileSizeEx(OPEN_EXISTING) war etwa 50% langsamer, fstreams noch etwas langsamer)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434441</guid><dc:creator><![CDATA[Moly]]></dc:creator><pubDate>Tue, 23 Dec 2014 21:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 21:48:48 GMT]]></title><description><![CDATA[<p>Moly schrieb:</p>
<blockquote>
<p>Danke an alle.<br />
stat (_wstat64) ist sogar am schnellsten, obwohl da ziemlich viele Informationen ausgelesen werden.<br />
(GetFileSizeEx(OPEN_EXISTING) war etwa 50% langsamer, fstreams noch etwas langsamer)</p>
</blockquote>
<p>Und nur zur Info: Wenns um Dateien geht, ist eh jede Geschwindigkeit verloren, ich würd mich nicht darum kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434443</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 23 Dec 2014 21:48:48 GMT</pubDate></item><item><title><![CDATA[Reply to ifstream::open: Schneller mit ios::binary? on Tue, 23 Dec 2014 22:10:12 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Und nur zur Info: Wenns um Dateien geht, ist eh jede Geschwindigkeit verloren, ich würd mich nicht darum kümmern.</p>
</blockquote>
<p>Das klingt ja eher nach einem Programm, das Informationen über das Dateisystem ausgibt, anstatt tatsächlich Daten zu lesen. Da fände ich das schon ziemlich wichtig und man kann auch jede Menge Sachen richtig oder falsch machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434450</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 23 Dec 2014 22:10:12 GMT</pubDate></item></channel></rss>