<?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[Dateihandling]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite an einer Software, die Daten von einer Ausleseeinheit aufnimmt und diese in eine Datei speichert.<br />
Das speichern selbst funktioniert ohne Probleme, ich kann die Dateien am Ende problemlos verarbeiten.<br />
Nun möchte ich aber ein Live-display bauen, dass mir die Daten schon währed des Leseprozesses auch darstellt.<br />
Da die Software objektorientiert aufgebaut ist, kann ich das nicht im gleichen Schritt machen, in dem die Daten gespeichert werden.<br />
Daher gehe ich wie folgt vor:<br />
Von einer Funktion bekomme ich die ich größe der Datei vor dem schreiben neuer Daten (new_file_size in bytes) und nach dem schreiben neuer Daten (old_filesize in bytes).<br />
Diese Daten gebe ich ich meine &quot;display_data&quot; Funktion.<br />
In dieser gehe ich dann wie folgt vor:</p>
<pre><code>unsigned int length=new_file_size-old_file_size; //Neu geschriebene Daten in Bytes

  ifstream input(c_output_filename, ios::in|ios::binary|ios::ate); 
  //oeffenen des gerade geschriebenes Datenfiles, dateipointer ans Ende

  for(int i=0;i&lt;length;i++) input.unget(); // Readoutpointer auf neue Daten stellen

  char * data_buffer;
  data_buffer =new char [length];
  input.read (data_buffer, length); //Store all the data within a buffer
  input.close();
</code></pre>
<p>Dann verarbeite ich die Daten.<br />
Allerdings bekomme ich immer 32 mal das gleiche &quot;Ereigniss&quot; angezeigt, d.h. wenn ich die Ereignisse durch nummerieren würde, sähe es wie folgt aus:</p>
<p>32 * Ereignis Nummer 0<br />
32 * Ereignis Nummer 31<br />
32 * Ereignis Nummer 63<br />
usw.</p>
<p>In jedem Schritt des Programmes erhöht sich die Dateigröße um 256 Byte! Diese Versuche ich dann darzustellen...</p>
<p>Wenn ich nach dem Ende des Programmes die geschriebene und geschlossene Datei konvertiere, ist die Ereignissstruktur korrekt, d.h.<br />
1 * Ereginis 0<br />
1 * Ereginis 1<br />
1 * Ereginis 2<br />
usw.</p>
<p>Ich weiß leider nicht mehr woran das liegt! Ein paar Ideen:<br />
--Wenn ich den neuen Stream zum lesen öffne, ist die Datei noch nicht geschlossen,da sie im nächsten Schritt ja wieder erweiter werden soll.</p>
<p>-- Setzte ich den Pointer falsch ???</p>
<p>Ich freue mich über euere Hilfe.<br />
Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311331/dateihandling</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 16:43:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311331.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Dec 2012 10:10:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 10:10:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite an einer Software, die Daten von einer Ausleseeinheit aufnimmt und diese in eine Datei speichert.<br />
Das speichern selbst funktioniert ohne Probleme, ich kann die Dateien am Ende problemlos verarbeiten.<br />
Nun möchte ich aber ein Live-display bauen, dass mir die Daten schon währed des Leseprozesses auch darstellt.<br />
Da die Software objektorientiert aufgebaut ist, kann ich das nicht im gleichen Schritt machen, in dem die Daten gespeichert werden.<br />
Daher gehe ich wie folgt vor:<br />
Von einer Funktion bekomme ich die ich größe der Datei vor dem schreiben neuer Daten (new_file_size in bytes) und nach dem schreiben neuer Daten (old_filesize in bytes).<br />
Diese Daten gebe ich ich meine &quot;display_data&quot; Funktion.<br />
In dieser gehe ich dann wie folgt vor:</p>
<pre><code>unsigned int length=new_file_size-old_file_size; //Neu geschriebene Daten in Bytes

  ifstream input(c_output_filename, ios::in|ios::binary|ios::ate); 
  //oeffenen des gerade geschriebenes Datenfiles, dateipointer ans Ende

  for(int i=0;i&lt;length;i++) input.unget(); // Readoutpointer auf neue Daten stellen

  char * data_buffer;
  data_buffer =new char [length];
  input.read (data_buffer, length); //Store all the data within a buffer
  input.close();
</code></pre>
<p>Dann verarbeite ich die Daten.<br />
Allerdings bekomme ich immer 32 mal das gleiche &quot;Ereigniss&quot; angezeigt, d.h. wenn ich die Ereignisse durch nummerieren würde, sähe es wie folgt aus:</p>
<p>32 * Ereignis Nummer 0<br />
32 * Ereignis Nummer 31<br />
32 * Ereignis Nummer 63<br />
usw.</p>
<p>In jedem Schritt des Programmes erhöht sich die Dateigröße um 256 Byte! Diese Versuche ich dann darzustellen...</p>
<p>Wenn ich nach dem Ende des Programmes die geschriebene und geschlossene Datei konvertiere, ist die Ereignissstruktur korrekt, d.h.<br />
1 * Ereginis 0<br />
1 * Ereginis 1<br />
1 * Ereginis 2<br />
usw.</p>
<p>Ich weiß leider nicht mehr woran das liegt! Ein paar Ideen:<br />
--Wenn ich den neuen Stream zum lesen öffne, ist die Datei noch nicht geschlossen,da sie im nächsten Schritt ja wieder erweiter werden soll.</p>
<p>-- Setzte ich den Pointer falsch ???</p>
<p>Ich freue mich über euere Hilfe.<br />
Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276729</guid><dc:creator><![CDATA[Matthias_1984_07]]></dc:creator><pubDate>Mon, 03 Dec 2012 10:10:33 GMT</pubDate></item><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 11:11:47 GMT]]></title><description><![CDATA[<p>Ich weiß gar nicht, ob das mit <code>unget</code> so überhaupt funktionieren müsste. Probier mal stattdessen <code>seekg</code> aus.</p>
<p>Was aber auch noch erwähnenswert ist, ist deine Verwendung von new char[]. Statt</p>
<pre><code class="language-cpp">char * data_buffer;
data_buffer =new char [length];
input.read (data_buffer, length); //Store all the data within a buffer
input.close();
</code></pre>
<p>solltest du</p>
<pre><code class="language-cpp">std::vector&lt;char&gt; data_buffer(length);
input.read (&amp;data_buffer[0], length); //Store all the data within a buffer
input.close();
</code></pre>
<p>schreiben.</p>
<p>So sieht nämlich eine Exception-sichere Resourcenverwaltung aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276741</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 03 Dec 2012 11:11:47 GMT</pubDate></item><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 11:23:48 GMT]]></title><description><![CDATA[<p>Ich hatte auch schon</p>
<pre><code>input.seekg (-length, ios::end);
</code></pre>
<p>allerdings mit ähnlichem Effekt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276747</guid><dc:creator><![CDATA[Matthias_1984_07]]></dc:creator><pubDate>Mon, 03 Dec 2012 11:23:48 GMT</pubDate></item><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 12:07:53 GMT]]></title><description><![CDATA[<p>Hallo nochmal,<br />
ich habe des Rätsels Lösung nun selbst gefunden. Es lag nicht an der Leseeinheit die ich hier präsentiert hatte, sonder an der Schreibeinheit!</p>
<p>Ich hatte diese nicht mit einem &quot;flush&quot; versehen.<br />
Das heißt die Daten waren in einem Zwischenspeicher gespeichert, aber noch nicht in die Datei selbst geschrieben. Der Schreibvorgang wurde alle 32 Events durchführt! Und somit habe ich 32 mal auf das Dateiende zugegriffen, was dann ja immer das gleiche war :-).</p>
<p>Tut mir leid für die Mühen, die ich bereitet habe.... Aber man kann ja auch immer was davon lernen: Nutzt &quot;flush&quot; regelmäßig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276764</guid><dc:creator><![CDATA[Matthias_1984_07]]></dc:creator><pubDate>Mon, 03 Dec 2012 12:07:53 GMT</pubDate></item><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 12:17:26 GMT]]></title><description><![CDATA[<p>Matthias_1984_07 schrieb:</p>
<blockquote>
<p>Aber man kann ja auch immer was davon lernen: Nutzt &quot;flush&quot; regelmäßig</p>
</blockquote>
<p>Die Lehre sollte eher sein: Dateien eignen sich nicht für eine &quot;Live-Übertragung&quot;, ich sollte etwas anderes (z.B. Sockets) benutzen. Festplatten sind nun mal sehr langsam, daher ja erst der ganze Aufwand mit dem flush.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276769</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 03 Dec 2012 12:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 12:17:09 GMT]]></title><description><![CDATA[<p>Matthias_1984_07 schrieb:</p>
<blockquote>
<p>Aber man kann ja auch immer was davon lernen: Nutzt &quot;flush&quot; regelmäßig</p>
</blockquote>
<p>Nee, das solltest du nicht daraus lernen. flush solltest du bis zuletzt vermeiden. In fast allen Programmen solltest du kein einziges flush (weder direkt noch durch endl) brauchen, höchstens das letzte, automatische flush beim Schließen von Dateien (aka Destruktor des fstream). Das ist natürlich keine absolute Regel, bloß ein Richtfaden. flush ist eine wahnsinnig teure Aktion.</p>
<p>Was du mitnehmen solltest, ist die Lektion aus dem dritten Link in meiner Signatur (dann hätten wir die direkt helfen können) und als allgemeine Stilanweisung: Halte Variablen so lokal wie möglich! Ist es wirklich nötig, dass der Schreibstream zur Zeit des Lesens noch existiert und sogar noch offen ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276772</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 03 Dec 2012 12:17:09 GMT</pubDate></item><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 13:20:09 GMT]]></title><description><![CDATA[<p>Ja und Nein :-).<br />
Sicher wäre es schöner, das lesen in einem anderen Prozess (sogar auf einem anderen Prozessor) zu machen.<br />
Aber der flush ist leider nicht der Geschwindigkeitsbegrenzende Prozess: Es läuft dort noch ein TApplicationMangager (<a href="http://www.root.cern.ch" rel="nofollow">www.root.cern.ch</a>) mit, der mir das ganze Program ausbremst.<br />
Am liebsten würde ich mein Program 3 teilen:<br />
Ein Prozess, der die Daten in den Ramspeicher schreibt.<br />
Ein zweiter Prozess, der die Daten vom Ram liest und auf die Fesplatte speichert und der dritte Prozess, der die Daten vom Ram liest und im Life display darstellt.<br />
Entweder sollen die Prozesse auf drei verhschieden Prozessoren laufen oder verschiedene Prioriäten haben.<br />
Leider weiß nicht wie das geht.</p>
<p>Das Minimalbeispiel mit komplleten Codes hätten auch leider aus drei Klassen bestanden, die einen Tundratreiber (universe chip) und die root Packete nutzen<br />
und wäre einfach zu groß geworden (ca. 5000 Zeilen....).<br />
Daher wollte ich mich auf das wesentliche beschränken, das aber leider nicht ausreichend war <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>Trotzdem nochmals Danke und Sorry!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276802</guid><dc:creator><![CDATA[Matthias_1984_07]]></dc:creator><pubDate>Mon, 03 Dec 2012 13:20:09 GMT</pubDate></item><item><title><![CDATA[Reply to Dateihandling on Mon, 03 Dec 2012 13:33:59 GMT]]></title><description><![CDATA[<p>Ist völlig problemlos, einfach die Datei mit nem Socket austauschen, und die anderen Programme können dann lauschen. :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2276809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2276809</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 03 Dec 2012 13:33:59 GMT</pubDate></item></channel></rss>