<?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[Problem mit ReadFile()]]></title><description><![CDATA[<p>Hallo,</p>
<p>tja, kaum klappt WriteFile(), schon habe ich Probleme mit ReadFile() <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>Ich habe versucht ReadFile analog zu WriteFile zu nutzen, aber es wird nichts eingelesen.</p>
<pre><code class="language-cpp">HANDLE benchFile = CreateFile(filename.c_str(),            
                                      GENERIC_WRITE | GENERIC_READ,
                                      FILE_SHARE_READ,
                                      NULL,
                                      CREATE_ALWAYS,
                                      FILE_ATTRIBUTE_NORMAL, // | FILE_FLAG_NO_BUFFERING,
                                      NULL);

int filesize = 100 * MB; 
char *filebuffer = new char [filesize]; 

DWORD bytesWritten = 0;
WriteFile(benchFile, filebuffer, filesize, &amp;bytesWritten, NULL);
cout &lt;&lt; bytesWritten &lt;&lt; endl;

DWORD bytesRead = 0;
ReadFile(benchFile, filebuffer, filesize, &amp;bytesRead, NULL);
cout &lt;&lt; bytesRead &lt;&lt; endl;
</code></pre>
<p>Ich habe keinerlei Anhaltspunkt, warum das nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295838/problem-mit-readfile</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 05:15:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295838.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Nov 2011 22:17:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 22:17:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>tja, kaum klappt WriteFile(), schon habe ich Probleme mit ReadFile() <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>Ich habe versucht ReadFile analog zu WriteFile zu nutzen, aber es wird nichts eingelesen.</p>
<pre><code class="language-cpp">HANDLE benchFile = CreateFile(filename.c_str(),            
                                      GENERIC_WRITE | GENERIC_READ,
                                      FILE_SHARE_READ,
                                      NULL,
                                      CREATE_ALWAYS,
                                      FILE_ATTRIBUTE_NORMAL, // | FILE_FLAG_NO_BUFFERING,
                                      NULL);

int filesize = 100 * MB; 
char *filebuffer = new char [filesize]; 

DWORD bytesWritten = 0;
WriteFile(benchFile, filebuffer, filesize, &amp;bytesWritten, NULL);
cout &lt;&lt; bytesWritten &lt;&lt; endl;

DWORD bytesRead = 0;
ReadFile(benchFile, filebuffer, filesize, &amp;bytesRead, NULL);
cout &lt;&lt; bytesRead &lt;&lt; endl;
</code></pre>
<p>Ich habe keinerlei Anhaltspunkt, warum das nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147612</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Tue, 22 Nov 2011 22:17:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 22:19:21 GMT]]></title><description><![CDATA[<p>Warum nimmst du nicht einfach std::ifstream?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147613</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 22 Nov 2011 22:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 22:29:31 GMT]]></title><description><![CDATA[<p>Ich denke, die Antwort darauf würde zu weit führen und ich kann mir auch nicht recht vorstellen, das es für die Fehlersuche von Belang wäre. Sorry.</p>
<p>Falls dem nicht so ist, würde ich natürlich mein Vorgehen von Anfang an beschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147618</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Tue, 22 Nov 2011 22:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 22:37:34 GMT]]></title><description><![CDATA[<p>Wenn du unbedingt ReadFile nutzen willst, dann frag im WinAPI Forum. std::vector solltest du hier manueller Speicherverwaltung aber in jedem Fall vorziehen.</p>
<p>Hast du schon mal die Rückgabewert der Funktion und GetLastError() getestet?</p>
<p>Und warum willst du keine fstreams nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147620</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 22 Nov 2011 22:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 22:35:08 GMT]]></title><description><![CDATA[<p>ich wette, readfile gibt einen wert != 0 zurück und bytesRead == 0.</p>
<pre><code class="language-cpp">HANDLE benchFile = CreateFile(filename.c_str(),            
                                      GENERIC_WRITE | GENERIC_READ,
                                      FILE_SHARE_READ,
                                      NULL,
                                      CREATE_ALWAYS,
                                      FILE_ATTRIBUTE_NORMAL, // | FILE_FLAG_NO_BUFFERING,
                                      NULL);
</code></pre>
<p>-&gt;erstelle datei - geht nehme ich an?</p>
<pre><code class="language-cpp">int filesize = 100 * MB; 
char *filebuffer = new char [filesize]; 

DWORD bytesWritten = 0;
WriteFile(benchFile, filebuffer, filesize, &amp;bytesWritten, NULL);
cout &lt;&lt; bytesWritten &lt;&lt; endl;
</code></pre>
<p>-&gt; schreibt _irgendetwas_ in die datei hinein - geht nehme ich an?</p>
<p>wir befinden uns am ende der datei.</p>
<pre><code class="language-cpp">DWORD bytesRead = 0;
ReadFile(benchFile, filebuffer, filesize, &amp;bytesRead, NULL);
cout &lt;&lt; bytesRead &lt;&lt; endl;
</code></pre>
<p>...und dort steht bekanntlich nichts mehr.</p>
<p>ich finde nur keine funktion, die den pointer verschieben könnte - hab aber auch nur nach irgendwas mit &quot;seek&quot; gesucht.´<br />
sag doch erst mal, was du überhaupt willst.<br />
etwas in eine datei zu schreiben und genau das gleiche dann wieder auslesen zu wollen, ergibt - für mich - keinen sinn.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147621</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 22 Nov 2011 22:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 22:37:13 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>Ich denke, die Antwort darauf würde zu weit führen und ich kann mir auch nicht recht vorstellen, das es für die Fehlersuche von Belang wäre. Sorry.</p>
</blockquote>
<p>Dann darfst du uns aber wenigstens deine Makroorgie und die Verwendung von new[] erklären. Insbesondere für letzteres kann es nun wirklich keine Gründe geben.</p>
<p>Zu deinem Problem: Nun, es steht ja auch nichts drin an der Stelle in der Datei. Der Dateizeiger zeigt nach dem Schreiben hinter das geschriebene. Da du die Datei neu erstellst, kann an der Stelle logischerweise nichts mehr sein.</p>
<p>edit: zu langsam.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147622</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 22 Nov 2011 22:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 23:06:08 GMT]]></title><description><![CDATA[<p>Nun ... :</p>
<p>Ich bin mit meinem C++ noch recht am Anfang und wollte mal versuchen einen kleinen Festplattenbenchmark zu schreiben. Angefangen habe ich mit put/get aber dort kamen unrealistische Werte raus und mir wurde gesagt, es sei reichlich ineffizient und ich solle CreateFile() und WriteFile/ReadFile nehmen oder zumindest write/read.</p>
<p>Mit write/read kamen schon etwas realistischere Werte raus, nur beim Lesen kam ich immer auf über 1 GB/s. Mir wurde gesagt, der Grund wäre das Caching des OS und ich solle doch wirklich mal CreateFile nehmen, vielleicht auch mit dem Flag FILE_FLAG_NO_BUFFERING.</p>
<p>Ich muss aber gestehen, das mir die WinAPI doch etwas schwer fällt, weshalb ich hier aufgeschlagen bin.</p>
<p>Was ich möchte, ist ein File gewählter Größe schreiben, was dann wieder eingelesen wird, dann noch ein Kopiervorgang aus lesen und schreiben.</p>
<p>Der Vorgang wird gemessen und wird in MB/s ausgegeben.</p>
<p>char *filebuffer habe ich von meinen write/read Versuchen übernommen und da bei WriteFile() auch alles in Ordnung war, dachte ich, das das dann auch nicht falsch wäre.</p>
<p>EDIT:</p>
<p>Um zu zeigen, was ich bisher versucht habe, mein Versuch mit write/read:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
//#include &lt;string&gt;
#include &lt;fstream&gt;
#include &lt;cmath&gt;
#include &lt;windows.h&gt;
#include &lt;cstdio&gt;  //für remove()

using namespace std;

const int MB = pow(2, 20);  //MegaByte
const int GB = pow(2, 30);  //Gigabyte

/*
int prozent(int i, int filesize){
    int value = (i * 100) / filesize;
    return value;
}
*/

bool pruefePartition(char partChar){
    string testfile = &quot;:/hdbench_test&quot;;
    testfile = partChar + testfile;
    ofstream file(testfile.c_str());
    if (!file){
        cout &lt;&lt; &quot;Fehler bei &quot; &lt;&lt; partChar &lt;&lt; &quot;:&quot; &lt;&lt; endl;
        return false;
    }
    file.close();
    remove(testfile.c_str());
    return true;
}

void schreibenFile(string bchfile, int filesize, char *filebuffer){
    ofstream file(bchfile.c_str(), ofstream::binary);
    file.write(filebuffer, filesize);
    file.close();
}

void lesenFile(string bchfile, int filesize, char *filebuffer){
    ifstream file(bchfile.c_str(), ifstream::binary);
    file.read(filebuffer, filesize);
    file.close();
}

void kopierenFile(string bchfile, int filesize, char *filebuffer){
    string bchfile_copy = bchfile + &quot;_copy&quot;;
    ifstream file(bchfile.c_str(), ifstream::binary);
    ofstream file_copy(bchfile_copy.c_str(), ofstream::binary);
    file.read(filebuffer, filesize);
    file_copy.write(filebuffer, filesize);
    file_copy.close();
    file.close();
}

int main(){

    char partChar;  //Buchstabe der Partition
    do{
        do{
            cin.sync();
            cout &lt;&lt; &quot;Partition angeben (nur den Buchstaben): &quot;;
            partChar = cin.get();
        }while ((partChar &lt; 'A'  || partChar &gt; 'z') &amp;&amp; (!(partChar &gt; 'Z' &amp;&amp; partChar &lt; 'a')));
    }while (!pruefePartition(partChar));

    cout &lt;&lt; endl;

    string bchfile = &quot;:/hdbench_file&quot;;  //Name des Benchfile
    bchfile = partChar + bchfile;
    int filesize = GB;  //Größe des Benchfile
    char *filebuffer = new char [filesize];  //Speicher für Benchfile reservieren
    LONGLONG frequency, curentCount, lastCount;  //Variablen für Zeitmessung
    QueryPerformanceFrequency((LARGE_INTEGER*) &amp; frequency);  //Performance Counter holen
    double time_sec;  //Zeit in Sekunden

    cout &lt;&lt; &quot;messe Schreiben ...&quot; &lt;&lt; endl;

    QueryPerformanceCounter((LARGE_INTEGER*) &amp; curentCount);  //1. Messung
    schreibenFile(bchfile, filesize, filebuffer);
    QueryPerformanceCounter((LARGE_INTEGER*) &amp; lastCount);  //2. Messung
    time_sec = (((double)(lastCount - curentCount)) / ((double)frequency));  //Zeit in Sekunden ist Differenz von Messung 2 und Messung 1
    double time_write =  time_sec;

    cout &lt;&lt; &quot;messe Lesen ...&quot; &lt;&lt; endl;

    QueryPerformanceCounter((LARGE_INTEGER*) &amp; curentCount);  //1. Messung
    lesenFile(bchfile, filesize, filebuffer);
    QueryPerformanceCounter((LARGE_INTEGER*) &amp; lastCount);  //2. Messung
    time_sec = (((double)(lastCount - curentCount)) / ((double)frequency));  //Zeit in Sekunden ist Differenz von Messung 2 und Messung 1
    double time_read = time_sec;

    cout &lt;&lt; &quot;messe Kopieren ...&quot; &lt;&lt; endl;

    QueryPerformanceCounter((LARGE_INTEGER*) &amp; curentCount);  //1. Messung
    kopierenFile(bchfile, filesize, filebuffer);
    QueryPerformanceCounter((LARGE_INTEGER*) &amp; lastCount);  //2. Messung
    time_sec = (((double)(lastCount - curentCount)) / ((double)frequency));  //Zeit in Sekunden ist Differenz von Messung 2 und Messung 1
    double time_copy = time_sec;

    remove(bchfile.c_str());
    remove((bchfile + &quot;_copy&quot;).c_str());
    delete filebuffer;

    int size_MB = filesize / MB;
    cout &lt;&lt; endl;
    cout &lt;&lt; size_MB &lt;&lt; &quot; MB geschrieben in Sekunden: &quot; &lt;&lt; time_write; cout.width(12); cout &lt;&lt; &quot;MB/s: &quot; &lt;&lt; size_MB / time_write &lt;&lt; endl;
    cout &lt;&lt; size_MB &lt;&lt; &quot; MB gelesen in Sekunden:     &quot; &lt;&lt; time_read; cout.width(12); cout &lt;&lt; &quot;MB/s: &quot; &lt;&lt; size_MB / time_read &lt;&lt; endl;
    cout &lt;&lt; size_MB &lt;&lt; &quot; MB kopiert in Sekunden:     &quot; &lt;&lt; time_copy; cout.width(12); cout &lt;&lt; &quot;MB/s: &quot; &lt;&lt; size_MB / time_copy &lt;&lt; endl;

}
</code></pre>
<p>und mein aktueller Versuch:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
//#include &lt;string&gt;
//#include &lt;fstream&gt;
#include &lt;cmath&gt;
#include &lt;windows.h&gt;
#include &lt;cstdio&gt;  //für remove()

using namespace std;

const int MB = pow(2, 20);  //MegaByte
//const int GB = pow(2, 30);  //Gigabyte

/*
int prozent(int i, int filesize){
    int value = (i * 100) / filesize;
    return value;
}
*/
/*
void schreibenFile(HANDLE benchFile, int filesize, char *filebuffer_out)
{
    DWORD bytesWritten = 0;
    WriteFile(benchFile, filebuffer_out, filesize, &amp;bytesWritten, NULL);
    //CloseHandle(benchFile);
}
*/
/*
void lesenFile(HANDLE benchFile, int filesize, char *filebuffer_in)
{
    DWORD bytesRead = 0;
    ReadFile(benchFile, filebuffer_in, filesize, &amp;bytesRead, NULL);
    cout &lt;&lt; bytesRead &lt;&lt; endl;
}
*/
/*
void kopierenFile(string bchfile, int filesize, char *filebuffer)
{
    string bchfile_copy = bchfile + &quot;_copy&quot;;
    ifstream file(bchfile.c_str(), ifstream::binary);
    ofstream file_copy(bchfile_copy.c_str(), ofstream::binary);
    file.read(filebuffer, filesize);
    file_copy.write(filebuffer, filesize);
    file_copy.close();
    file.close();
}
*/

int main(){

    string filename_proto = &quot;:/hdbench_file&quot;;  //Name des Benchfile
    string filename;
    char partChar;  //Buchstabe der Partition
    bool partChar_true;  //Partitionsbuchstabe gültig?
    HANDLE benchFile;

    do{
        do{
            cin.sync();
            cout &lt;&lt; &quot;Partition angeben (nur den Buchstaben): &quot;;
            partChar = cin.get();
        }while ((partChar &lt; 'A'  || partChar &gt; 'z') &amp;&amp; (!(partChar &gt; 'Z' &amp;&amp; partChar &lt; 'a')));
        filename = partChar + filename_proto;
        benchFile = CreateFile(filename.c_str(),            //Benchfile anlegen
                                      GENERIC_WRITE | GENERIC_READ,
                                      FILE_SHARE_READ,
                                      NULL,
                                      CREATE_ALWAYS,
                                      FILE_ATTRIBUTE_NORMAL, // | FILE_FLAG_NO_BUFFERING,
                                      NULL);
        if (benchFile == INVALID_HANDLE_VALUE){
            cout &lt;&lt; &quot;Fehler bei &quot; &lt;&lt; partChar &lt;&lt; &quot;:&quot; &lt;&lt; endl;
            partChar_true = false;
        }else{
            partChar_true = true;
        }
    }while (!partChar_true);

    cout &lt;&lt; endl;

    int filesize = 100 * MB;  //Größe des Benchfile
    char *filebuffer = new char [filesize];  //Speicher für Benchfile reservieren
    LONGLONG frequency, curentCount, lastCount;  //Variablen für Zeitmessung
    QueryPerformanceFrequency((LARGE_INTEGER*) &amp; frequency);  //Performance Counter holen
    double time_sec;  //Zeit in Sekunden

        cout &lt;&lt; &quot;messe Schreiben ...&quot; &lt;&lt; endl;

        //char *filebuffer_out = new char [filesize];  //Speicher für Benchfile reservieren
        DWORD bytesWritten = 0;
        QueryPerformanceCounter((LARGE_INTEGER*) &amp; curentCount);  //1. Messun
        WriteFile(benchFile, filebuffer, filesize, &amp;bytesWritten, NULL);
        cout &lt;&lt; bytesWritten &lt;&lt; endl;
        QueryPerformanceCounter((LARGE_INTEGER*) &amp; lastCount);  //2. Messung
        time_sec = (((double)(lastCount - curentCount)) / ((double)frequency));  //Zeit in Sekunden ist Differenz von Messung 2 und Messung 1
        double time_write =  time_sec;

        cout &lt;&lt; &quot;messe Lesen ...&quot; &lt;&lt; endl;

        //char *filebuffer_in = new char [filesize];  //Speicher für Benchfile reservieren
        DWORD bytesRead = 0;
        QueryPerformanceCounter((LARGE_INTEGER*) &amp; curentCount);  //1. Messung
        ReadFile(benchFile, filebuffer, filesize, &amp;bytesRead, NULL);
        cout &lt;&lt; bytesRead &lt;&lt; endl;
        QueryPerformanceCounter((LARGE_INTEGER*) &amp; lastCount);  //2. Messung
        time_sec = (((double)(lastCount - curentCount)) / ((double)frequency));  //Zeit in Sekunden ist Differenz von Messung 2 und Messung 1
        double time_read = time_sec;

/*
        cout &lt;&lt; &quot;messe Kopieren ...&quot; &lt;&lt; endl;

        string filename_copy = filename +&quot;_copy&quot;;
        HANDLE benchFile_copy = CreateFile(filename_copy.c_str(),            //Benchfile anlegen
                                      GENERIC_WRITE | GENERIC_READ,
                                      FILE_SHARE_READ,
                                      NULL,
                                      CREATE_ALWAYS,
                                      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING,
                                      NULL);

        QueryPerformanceCounter((LARGE_INTEGER*) &amp; curentCount);  //1. Messung
        kopierenFile(benchFile, benchfile_copy, filesize, filebuffer);
        QueryPerformanceCounter((LARGE_INTEGER*) &amp; lastCount);  //2. Messung
        time_sec = (((double)(lastCount - curentCount)) / ((double)frequency));  //Zeit in Sekunden ist Differenz von Messung 2 und Messung 1
        double time_copy = time_sec;

*/
        CloseHandle(benchFile);
        //remove(filename.c_str());
        //remove((bchfile + &quot;_copy&quot;).c_str());
        //delete filebuffer;

        int size_MB = filesize / MB;
        cout &lt;&lt; endl;
        cout &lt;&lt; size_MB &lt;&lt; &quot; MB geschrieben in Sekunden: &quot; &lt;&lt; time_write; cout.width(12); cout &lt;&lt; &quot;MB/s: &quot; &lt;&lt; size_MB / time_write &lt;&lt; endl;
        cout &lt;&lt; size_MB &lt;&lt; &quot; MB gelesen in Sekunden:     &quot; &lt;&lt; time_read; cout.width(12); cout &lt;&lt; &quot;MB/s: &quot; &lt;&lt; size_MB / time_read &lt;&lt; endl;
        //cout &lt;&lt; size_MB &lt;&lt; &quot; MB kopiert in Sekunden:     &quot; &lt;&lt; time_copy; cout.width(12); cout &lt;&lt; &quot;MB/s: &quot; &lt;&lt; size_MB / time_copy &lt;&lt; endl;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2147632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147632</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Tue, 22 Nov 2011 23:06:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 23:11:23 GMT]]></title><description><![CDATA[<p>Kurz gesagt: Du versuchst da gerade unfreiwillig, einen Benchmark für den Arbeitsspeicher zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147635</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 22 Nov 2011 23:11:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Tue, 22 Nov 2011 23:24:14 GMT]]></title><description><![CDATA[<p>Ja, das habe ich zumindest beim Lesen auch festgestellt. Beim Schreiben kommen so Werte um 120 MB/s raus, die auch tatsächliche Benchmarks anzeigen.</p>
<p>Und ich hatte halt gehofft, mit CreateFile und ReadFile könnte ich das umgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147641</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Tue, 22 Nov 2011 23:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Wed, 23 Nov 2011 03:22:06 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Kurz gesagt: Du versuchst da gerade unfreiwillig, einen Benchmark für den Arbeitsspeicher zu schreiben.</p>
</blockquote>
<p>Ich hab mich auch mal dran versucht... Meiner Meinung nach sollte das ja der richtige Weg sein:</p>
<pre><code class="language-cpp">/*timer.hpp*/

#include &quot;windows.h&quot;

#include &lt;cassert&gt;
#include &lt;stdexcept&gt;

struct large_integer_t
{
	typedef __int64 integral_type;
	operator float() const
	{
		return static_cast&lt;float&gt;( static_cast&lt;integral_type&gt;(*this) );
	}

	operator integral_type() const
	{
		return data.QuadPart;
	}
	operator integral_type()
	{
		return data.QuadPart;
	}

	large_integer_t()
	:	data(LARGE_INTEGER())
	{}

	large_integer_t(const LARGE_INTEGER&amp; data)
	:	data(data)
	{}

	large_integer_t&amp; operator-= (const large_integer_t&amp; other)
	{
		data.QuadPart -= other.data.QuadPart;
		return *this;
	}
private:
	LARGE_INTEGER data;
};

large_integer_t operator- (const large_integer_t&amp; lhs, const large_integer_t&amp; rhs)
{
	large_integer_t tmp(lhs);
	tmp -= rhs;
	return tmp;
}

class timer_t
{
public:
	typedef float second_t;

	timer_t()
	:	begin(get_timestamp())
#if !defined (NDEBUG)
	,	stopped(false)
#endif //#if !defined (_NDEBUG)
	{
		end = begin;
	}

	void stop()
	{
#if !defined (NDEBUG)
		stopped = true;
#endif //#if !defined (_NDEBUG)

		end = get_timestamp();
	}

	second_t get_seconds() const
	{
		assert(stopped);

		return (end-begin)/static_cast&lt;second_t&gt;(get_frequency());
	}

private:
#if !defined (NDEBUG)
	bool stopped;
#endif //#if !defined (_NDEBUG)

	static large_integer_t get_frequency()
	{
		LARGE_INTEGER ret_val;
		BOOL succeed = QueryPerformanceFrequency(&amp;ret_val);

		if(!succeed)
			throw std::runtime_error(&quot;calling QueryPerformanceFrequency failed&quot;);

		return ret_val;
	}

	static large_integer_t get_timestamp()
	{
		LARGE_INTEGER ret_val;
		BOOL succeed = QueryPerformanceCounter(&amp;ret_val);

		if(!succeed)
			throw std::runtime_error(&quot;calling QueryPerformanceCounter failed&quot;);

		return ret_val;
	}

	large_integer_t begin;
	large_integer_t end;
};
</code></pre>
<pre><code class="language-cpp">/*file_op.hpp*/

#include &quot;windows.h&quot;

#include &lt;stdexcept&gt;

class file_t
{
public:
	bool is_open() const
	{
		return fd != INVALID_HANDLE_VALUE;
	}

	bool bad() const
	{
		return !is_open() || op_failed;
	}
	bool good() const
	{
		return !bad();
	}

	void write(char* const first, std::size_t length)
	{
		if(bad())
			return;

		DWORD length_wrote;
		BOOL succeeds = WriteFile(fd, first, static_cast&lt;DWORD&gt;(length), &amp;length_wrote, NULL);

		op_failed = !succeeds || (static_cast&lt;std::size_t&gt;(length_wrote) != length);
	}

	void read(char* first, std::size_t length)
	{
		if(bad())
			return;

		DWORD length_read;
		BOOL succeeds = ReadFile(fd, first, static_cast&lt;DWORD&gt;(length), &amp;length_read, NULL);

		op_failed = !succeeds || (static_cast&lt;std::size_t&gt;(length_read) != length);
	}

	static file_t create(const char* filename)
	{
		HANDLE hwnd = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
		return file_t(hwnd);
	}
	static file_t open(const char* filename)
	{
		HANDLE hwnd = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
		return file_t(hwnd);
	}
	static void close(file_t&amp; to_close)
	{
		if( !to_close.is_open() )
			return;

		CloseHandle(to_close.fd);
		to_close.fd = INVALID_HANDLE_VALUE;
	}
private:
	explicit file_t(HANDLE fd)
	:	fd(fd), op_failed(false)
	{}

	HANDLE fd;
	bool op_failed;
};

void delete_file(const char* filename)
{
	BOOL succeed = DeleteFile(filename);
	if(!succeed)
		throw std::runtime_error(&quot;cannot delete file&quot;);
}
</code></pre>
<pre><code class="language-cpp">/*main.cpp*/

#include &quot;timer.hpp&quot;
#include &quot;file_op.hpp&quot;

template &lt;class T, std::size_t n&gt;
std::size_t size_of(const T(&amp;)[n])
{
	return n;
}

void do_and_print(const char* filename, std::size_t size_in_mb);

#include &lt;iostream&gt;

int main()
{
	const char* filenames[] =
	{
		&quot;C:/tmp.txt&quot;,
		&quot;E:/tmp.txt&quot;,
		&quot;L:/tmp.txt&quot;,
		&quot;H:/tmp.txt&quot;
	};

	std::size_t megabyte_count;
	std::cout &lt;&lt; &quot;wie viele MB sollen jeweils gelesen/geschrieben werden?&quot; &lt;&lt; std::endl;
	std::cin &gt;&gt; megabyte_count;

	for(std::size_t i = 0; i != size_of(filenames); ++i)
	{
		std::cout &lt;&lt; filenames[i] &lt;&lt; std::endl;
		do_and_print(filenames[i], megabyte_count);
	}

#if 0
	std::cout &lt;&lt; &quot;Taste...&quot; &lt;&lt; std::endl;
	std::cin.ignore();
	std::cin.get();
#endif
}

#include &lt;algorithm&gt;
#include &lt;iomanip&gt;
#include &lt;vector&gt;

void do_and_print(const char* filename, std::size_t size_in_mb)
{
	if(size_in_mb == 0)
		return;

	std::ios_base::fmtflags flag_backup = std::cout.flags();
	std::cout &lt;&lt; std::setprecision(3) &lt;&lt; std::fixed;

	const std::size_t MB = 1024 * 1024;
	const std::size_t buffer = size_in_mb * MB;

	bool created_file = false;

	std::vector&lt;char&gt; to_write(buffer, '1');
	{
		file_t file = file_t::create(filename);
		created_file = file.is_open();
		timer_t time;
		file.write(&amp;to_write[0], to_write.size());
		time.stop();

		if(file.bad())
			std::cout &lt;&lt; &quot;schreiben fehlgeschlagen&quot; &lt;&lt; std::endl;
		else
			std::cout &lt;&lt; &quot;schreiben (&quot; &lt;&lt; size_in_mb &lt;&lt; &quot; MB): &quot; &lt;&lt; time.get_seconds() &lt;&lt; &quot;-&gt; &quot; &lt;&lt; size_in_mb/time.get_seconds() &lt;&lt; &quot; MBps&quot; &lt;&lt; std::endl;

		file_t::close(file);
	}
	std::vector&lt;char&gt; to_read(buffer, '0');

	if(created_file)
	{
		file_t file = file_t::open(filename);
		timer_t time;
		file.read(&amp;to_read[0], to_read.size());
		time.stop();

		if(file.bad())
			std::cout &lt;&lt; &quot;lesen fehlgeschlagen&quot; &lt;&lt; std::endl;
		else
			std::cout &lt;&lt; &quot;    lesen (&quot; &lt;&lt; size_in_mb &lt;&lt; &quot; MB): &quot; &lt;&lt; time.get_seconds() &lt;&lt; &quot;-&gt; &quot; &lt;&lt; size_in_mb/time.get_seconds() &lt;&lt; &quot; MBps&quot; &lt;&lt; std::endl;

		file_t::close(file);
	}

	if(to_write != to_read)
		std::cout &lt;&lt; &quot;kaputt ;)&quot; &lt;&lt; std::endl;

	if(created_file)
		delete_file(filename);

	std::cout.flags(flag_backup);
}
</code></pre>
<pre><code>wie viele MB sollen jeweils gelesen/geschrieben werden?
C:/tmp.txt
schreiben (5 MB): 0.162-&gt; 30.818 MBps
    lesen (5 MB): 0.228-&gt; 21.895 MBps
E:/tmp.txt
schreiben (5 MB): 0.180-&gt; 27.835 MBps
    lesen (5 MB): 0.003-&gt; 1495.359 MBps
L:/tmp.txt
schreiben (5 MB): 0.149-&gt; 33.455 MBps
    lesen (5 MB): 0.054-&gt; 92.113 MBps
H:/tmp.txt
schreiben (5 MB): 1.983-&gt; 2.521 MBps
    lesen (5 MB): 0.253-&gt; 19.797 MBps
</code></pre>
<pre><code>wie viele MB sollen jeweils gelesen/geschrieben werden?
C:/tmp.txt
schreiben (50 MB): 1.621-&gt; 30.850 MBps
    lesen (50 MB): 1.769-&gt; 28.257 MBps
E:/tmp.txt
schreiben (50 MB): 1.397-&gt; 35.779 MBps
    lesen (50 MB): 0.035-&gt; 1416.357 MBps
L:/tmp.txt
schreiben (50 MB): 1.222-&gt; 40.904 MBps
    lesen (50 MB): 0.383-&gt; 130.452 MBps
H:/tmp.txt
schreiben (50 MB): 5.537-&gt; 9.030 MBps
    lesen (50 MB): 2.360-&gt; 21.189 MBps
</code></pre>
<pre><code>wie viele MB sollen jeweils gelesen/geschrieben werden?
C:/tmp.txt
schreiben (200 MB): 6.472-&gt; 30.902 MBps
    lesen (200 MB): 6.657-&gt; 30.043 MBps
E:/tmp.txt
schreiben (200 MB): 6.053-&gt; 33.041 MBps
    lesen (200 MB): 0.211-&gt; 949.562 MBps
L:/tmp.txt
schreiben (200 MB): 4.585-&gt; 43.617 MBps
    lesen (200 MB): 1.978-&gt; 101.106 MBps
H:/tmp.txt
schreiben (200 MB): 26.159-&gt; 7.645 MBps
    lesen (200 MB): 9.288-&gt; 21.534 MBps
</code></pre>
<p>C+E sind Partitionen auf ner uralten IDE Platte. Bei E ist die Komprimierung aktiviert, deshalb die utopischen Lese-Werte^^</p>
<p>L ist nen RAID5 über 5 SATA Platten, da sollte aber einiges an Geschwindigkeit durch die Verschlüsselung verloren gehen. Und natürlich auch schon durch den Controller - aber der auf dem Board muss reichen, bis ich mal im Lotto gewonnen habe <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>
<p>H ist nen USB-Stick</p>
<p>Scheint doch gar nicht mal so unrealistisch zu sein.</p>
<p>bb</p>
<p>so, das war jetzt das letzte edit - die einzige (für mich) offensichtliche schwäche liegt an der mangelnden fehlerbehandlung und dem fehlenden RAII für file - aber ich wollts auch nich total übertreiben^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147647</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 23 Nov 2011 03:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Wed, 23 Nov 2011 19:28:57 GMT]]></title><description><![CDATA[<p>Also der Code hat mich schon beeindruckt <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="🙂"
    /> Leider ist er in meinen Augen so komplex, das ich ihn, oder Teile davon, nicht übernehmen kann. Ich habe nicht nur mit der WinAPI Schwierigkeiten, sondern schon mit der OOP <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2147950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147950</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Wed, 23 Nov 2011 19:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Wed, 23 Nov 2011 20:00:58 GMT]]></title><description><![CDATA[<p>den timer musst du nicht verstehen, der rest sollte aber auch für einen anfänger relativ gut zu verstehen sein?!</p>
<p>wo liegt denn dein problem genau? oder beser: wo bist du denn in deinem buch und welches liest du denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147963</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 23 Nov 2011 20:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Wed, 23 Nov 2011 20:10:27 GMT]]></title><description><![CDATA[<p>Ich habe den 'Der C++ Programmierer' von Ulrich Breymann und bin im letzten Kapitel, bevor die OOP angeschnitten wird, genauer bei Programmstrukturierung.</p>
<p>Und falls Du die timer.hpp meinst, da erkenne ich nur durch die cout-Ausgaben, das sie wohl mit der Zeitmessung zusammen hängt und just die funktioniert bei mir ja einwandfrei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2147970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147970</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Wed, 23 Nov 2011 20:10:27 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Wed, 23 Nov 2011 20:18:32 GMT]]></title><description><![CDATA[<p>na gut, dann lies ma noch paar kapitel, dann wirst dus auch versthen <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/2147979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2147979</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 23 Nov 2011 20:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Thu, 24 Nov 2011 03:14:52 GMT]]></title><description><![CDATA[<p>Ich habe mal Dein Code bei mir kompilieren lassen und (ohne einen Zweifel gehabt zu haben ;)) die Werte waren auch bei mir realistisch.</p>
<p>Gibt es einen Grund, warum Du Deine Headerfiles .hpp genannt hast? Die werden doch sonst immer nur .h genannt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2148038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2148038</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Thu, 24 Nov 2011 03:14:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Thu, 24 Nov 2011 07:17:25 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>Ich habe mal Dein Code bei mir kompilieren lassen und (ohne einen Zweifel gehabt zu haben ;)) die Werte waren auch bei mir realistisch.</p>
<p>Gibt es einen Grund, warum Du Deine Headerfiles .hpp genannt hast? Die werden doch sonst immer nur .h genannt?</p>
</blockquote>
<p>.hpp ist eine nette Abgrenzung zu C-Headern, wird fast öfters verwendet als .h</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2148051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2148051</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 24 Nov 2011 07:17:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Thu, 24 Nov 2011 09:56:29 GMT]]></title><description><![CDATA[<p>Wie macht man das denn in einer IDE? CodeBlocks zB bietet scheinbar nur h.files, cpp.files und leere Files an.</p>
<p>Ich kann mir kaum vorstellen, das man die dann händisch umbenennt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2148115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2148115</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Thu, 24 Nov 2011 09:56:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit ReadFile() on Thu, 24 Nov 2011 16:31:27 GMT]]></title><description><![CDATA[<p>Ahja, inzwischen ist es mir eingefallen. Einfach bei leeres File *.hpp eingeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2148305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2148305</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Thu, 24 Nov 2011 16:31:27 GMT</pubDate></item></channel></rss>