<?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[Probleme mit Streams und Dateien]]></title><description><![CDATA[<p>Hi Leute</p>
<p>da ich diverse structs in einer Datei speichern (und auch wieder lesen) möchte habe ich mich am C++ FAQ &quot;Streams und Dateien&quot; orientiert.</p>
<p><strong>Problem: die Ausgaben enthalten Seitenweise &quot;Müll&quot;. Einige &quot;PATH = ...&quot; Einträge von Windows, &quot;PROMPT&quot; und auch das komplette Alphabet in Klein-und Großbuchstaben.</strong></p>
<p><strong>Hier mal das Struct um das sich alles dreht:</strong></p>
<pre><code class="language-cpp">struct Tprocedure
{
   string Source;
   string Destination;
   time_t Last;
};
</code></pre>
<p>Angaben zum Projekt:</p>
<p>die Variable &quot;list&quot; enthält diverse Objekte einer Klasse &quot;BACKUP&quot;. Diese Klasse enthält auch das struct &quot;Tprocedure&quot;, also die eigentlichen Daten die gespeichert werden sollen.</p>
<pre><code class="language-cpp">vector &lt;BACKUP*&gt; list;
</code></pre>
<p>alle Inhalte des zwecks Speichern zuürckgelieferten Objekts wurden untersucht und sind inhaltlich in Ordnung.</p>
<pre><code class="language-cpp">Tprocedure proc = list[i]-&gt;GetProcedure(j);
</code></pre>
<p><strong>Hier mal die Funktion die die structs speichert:</strong></p>
<pre><code class="language-cpp">void BACKUPLIST::SaveToFile(string filename)
{
   fstream File(filename.c_str(), ios::out|ios::binary);
   if (File.is_open())
   {              
      for (int i = 0; i &lt; list.size(); i++)
      {
         for (int j = 0; j &lt; list[i]-&gt;GetProcNum(); j++)
         { 
            Tprocedure proc = list[i]-&gt;GetProcedure(j);
            File.write((const char*)&amp;proc, sizeof(Tprocedure));
         }
      }
      File.close();
   }
}
</code></pre>
<p><strong>Hier nun die Funktion die Daten aus der Datei liest und diese ausgibt:</strong></p>
<pre><code class="language-cpp">void BACKUPLIST::LoadFromFile(string filename)
{
   fstream File(filename.c_str(), ios::in|ios::binary);
   if (File.is_open())
   {
      Tprocedure proc;
      while (File.read((char*)&amp;proc, sizeof(Tprocedure)))
         cout &lt;&lt; proc.Source &lt;&lt; endl;
      File.close();
   } 
}
</code></pre>
<p>Der Aufruf der Funktionen LoadFromFile und SaveToFile wird jeweils folgendermaßen durchgeführt:</p>
<pre><code class="language-cpp">filesave.LoadFromFile(&quot;D:\\Programme\\BackUp_Builder\\data.dat&quot;);
</code></pre>
<p>Mit doppelten Backslashes, also auch korrekt wie ich vermute.</p>
<p>Woran kann das liegen, dass die gespeicherten Daten nicht korrekt geladen werden, oder falsch gespeichert wurden?<br />
Ich hab mich bei der Entwicklung der Funktionen ziemlich präzise an das FAQ gehalten und an die Angaben zu &quot;C++ I/O&quot; und &quot;Streams&quot; auf <a href="http://www.cppreference.com" rel="nofollow">www.cppreference.com</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208195/probleme-mit-streams-und-dateien</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 16:49:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208195.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Mar 2008 23:37:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Streams und Dateien on Sat, 15 Mar 2008 23:37:26 GMT]]></title><description><![CDATA[<p>Hi Leute</p>
<p>da ich diverse structs in einer Datei speichern (und auch wieder lesen) möchte habe ich mich am C++ FAQ &quot;Streams und Dateien&quot; orientiert.</p>
<p><strong>Problem: die Ausgaben enthalten Seitenweise &quot;Müll&quot;. Einige &quot;PATH = ...&quot; Einträge von Windows, &quot;PROMPT&quot; und auch das komplette Alphabet in Klein-und Großbuchstaben.</strong></p>
<p><strong>Hier mal das Struct um das sich alles dreht:</strong></p>
<pre><code class="language-cpp">struct Tprocedure
{
   string Source;
   string Destination;
   time_t Last;
};
</code></pre>
<p>Angaben zum Projekt:</p>
<p>die Variable &quot;list&quot; enthält diverse Objekte einer Klasse &quot;BACKUP&quot;. Diese Klasse enthält auch das struct &quot;Tprocedure&quot;, also die eigentlichen Daten die gespeichert werden sollen.</p>
<pre><code class="language-cpp">vector &lt;BACKUP*&gt; list;
</code></pre>
<p>alle Inhalte des zwecks Speichern zuürckgelieferten Objekts wurden untersucht und sind inhaltlich in Ordnung.</p>
<pre><code class="language-cpp">Tprocedure proc = list[i]-&gt;GetProcedure(j);
</code></pre>
<p><strong>Hier mal die Funktion die die structs speichert:</strong></p>
<pre><code class="language-cpp">void BACKUPLIST::SaveToFile(string filename)
{
   fstream File(filename.c_str(), ios::out|ios::binary);
   if (File.is_open())
   {              
      for (int i = 0; i &lt; list.size(); i++)
      {
         for (int j = 0; j &lt; list[i]-&gt;GetProcNum(); j++)
         { 
            Tprocedure proc = list[i]-&gt;GetProcedure(j);
            File.write((const char*)&amp;proc, sizeof(Tprocedure));
         }
      }
      File.close();
   }
}
</code></pre>
<p><strong>Hier nun die Funktion die Daten aus der Datei liest und diese ausgibt:</strong></p>
<pre><code class="language-cpp">void BACKUPLIST::LoadFromFile(string filename)
{
   fstream File(filename.c_str(), ios::in|ios::binary);
   if (File.is_open())
   {
      Tprocedure proc;
      while (File.read((char*)&amp;proc, sizeof(Tprocedure)))
         cout &lt;&lt; proc.Source &lt;&lt; endl;
      File.close();
   } 
}
</code></pre>
<p>Der Aufruf der Funktionen LoadFromFile und SaveToFile wird jeweils folgendermaßen durchgeführt:</p>
<pre><code class="language-cpp">filesave.LoadFromFile(&quot;D:\\Programme\\BackUp_Builder\\data.dat&quot;);
</code></pre>
<p>Mit doppelten Backslashes, also auch korrekt wie ich vermute.</p>
<p>Woran kann das liegen, dass die gespeicherten Daten nicht korrekt geladen werden, oder falsch gespeichert wurden?<br />
Ich hab mich bei der Entwicklung der Funktionen ziemlich präzise an das FAQ gehalten und an die Angaben zu &quot;C++ I/O&quot; und &quot;Streams&quot; auf <a href="http://www.cppreference.com" rel="nofollow">www.cppreference.com</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475059</guid><dc:creator><![CDATA[It0101]]></dc:creator><pubDate>Sat, 15 Mar 2008 23:37:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Streams und Dateien on Sat, 15 Mar 2008 23:45:37 GMT]]></title><description><![CDATA[<p>Da hilft nur eins!<br />
Nimm Linux.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475060</guid><dc:creator><![CDATA[linuxnehmer]]></dc:creator><pubDate>Sat, 15 Mar 2008 23:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Streams und Dateien on Sun, 16 Mar 2008 00:33:54 GMT]]></title><description><![CDATA[<p>linuxnehmer schrieb:</p>
<blockquote>
<p>Da hilft nur eins!<br />
Nimm Linux.</p>
</blockquote>
<p>da hilft nur eins! Rechner wegsperren.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6029">@It0101</a></p>
<p>so wie du das machen willst funktioniert das nur mit pods.<br />
std::string haelt intern nur einen zeiger auf den eigendlichen string und noch paar zusaetzliche werte.<br />
damit das klappt musst Tprocedure serialisieren.</p>
<p>beispiel:</p>
<pre><code class="language-cpp">struct A
{
   std::string s1, s2;
}

void serialize_string(std::ostream &amp;out, const std::string &amp;s)
{
   std::size_t len = s.size();
   out.write(&amp;len, sizeof(len));
   out.write(s.c_str(), len);
}

std::ostream&amp; operator&lt;&lt;(std::ostream &amp;out, const A &amp;a)
{
   serialize_string(out, a.s1);
   serialize_string(out, a.s2);
   return out;
}

void deserialize_string(std::istream &amp;in, std::string &amp;s)
{
   std::size_t len = 0;
   std::streambuf *buf = in.rdbuf();
   in.read(&amp;len, sizeof(len));
   for(std::size_t i = 0;i &lt; len;++i)
      s.assign(buf-&gt;sbumpc());
}

std::istream&amp; operator&gt;&gt;(std::istream &amp;in, A &amp;a)
{
   deserialize_string(in, a.s1);
   deserialize_string(in, a.s2);

   return in;
}

// so kannst du dann A-objekte in dateien schreiben und wieder auslesen

std::ofstream odatei(...);
A a;
...
odatei &lt;&lt; a;

...
std::ifstream idatei(...);
A a;
...
idatei &gt;&gt; a;
</code></pre>
<p>so koennte es zum beispiel aussehen. hab das nur mal aus dem kopf geschrieben. koennen fehler vorhanden sein.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475070</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 16 Mar 2008 00:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Streams und Dateien on Sun, 16 Mar 2008 09:28:26 GMT]]></title><description><![CDATA[<p>danke dir für deine Mühe <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>Ich hatte mir schon gedacht dass es irgendwas mit den Strings zu tun hat.<br />
Ich werd mir das gleich mal anschauen.</p>
<p>Gehe ich recht in der Annahme, dass es auf meine Weise funktionieren würde, wenn ich statt der Strings einfach Variablen vom Typ Char[N] benutzen würde, also Character mit definierter Länge?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475101</guid><dc:creator><![CDATA[It0101]]></dc:creator><pubDate>Sun, 16 Mar 2008 09:28:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Streams und Dateien on Sun, 16 Mar 2008 11:08:21 GMT]]></title><description><![CDATA[<p>jups</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475152</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 16 Mar 2008 11:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Streams und Dateien on Sun, 16 Mar 2008 11:26:35 GMT]]></title><description><![CDATA[<p>Meep Meep, sieht gut aus, nur</p>
<pre><code class="language-cpp">for(std::size_t i = 0;i &lt; len;++i) 
    s.assign(buf-&gt;sbumpc());
</code></pre>
<p>ergibt keinen Sinn.</p>
<p>Wenn man davon ausgeht, daß der String-Speicher intern am Stück vorliegt, dann reicht auch:</p>
<pre><code class="language-cpp">s.resize(len);
in.read(&amp;s[0], len);
</code></pre>
<p>Ich weiß, daß camper jetzt wieder meckern wird, aber ich kenne keine Implementation, die das anders macht.<br />
Ansonsten könnte man selbst noch in einer Schleife die Werte einzeln zuweisen:</p>
<pre><code class="language-cpp">s.resize(len);
for(std::size_t i = 0;i &lt; len;++i)
    s[i] = static_cast&lt;char&gt;(buf-&gt;sbumpc());
</code></pre>
<p>Wahrscheinlich meinte dies Meep Meep so, denn assign überschreibt ja immer wieder den Stringpuffer. (Überleg... ich hab's jetzt: Meep Meep meinte 'append' !!!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475163</guid><dc:creator><![CDATA[~deserialize]]></dc:creator><pubDate>Sun, 16 Mar 2008 11:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Streams und Dateien on Sun, 16 Mar 2008 12:46:24 GMT]]></title><description><![CDATA[<p>~deserialize schrieb:</p>
<blockquote>
<p>Ich weiß, daß camper jetzt wieder meckern wird, aber ich kenne keine Implementation, die das anders macht.</p>
</blockquote>
<p>Wie richtig gesagt wurde, ist das mit jeder praktisch relevanten Implementation möglich. Zudem wurden entsprechende Garantien in den gegenwärtigen Entwurf des nächsten Standards aufgenommen, man kann also davon ausgehen, das das auch in Zukunft und dann ganz offiziell so möglich ist. Insofern sehe ich keine ernsthaften Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1475200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1475200</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 16 Mar 2008 12:46:24 GMT</pubDate></item></channel></rss>