<?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[nach bestimmter zahl in neue Datei schreiben]]></title><description><![CDATA[<p>Hallo,</p>
<p>bin ein echter newbe, doch möchte ich nun einen Aufgabe lösen.<br />
Der Titel ist warscheinlich nicht aussagekräftig. Daher hier die Fragestellung:</p>
<p>ich hab ein Programm das Werte errechnet und in eine Datei schreibt, wenn man dem Programm als Argument den Dateinamen übergibt. Nun soll aber nicht eine einzige Datei mit den Werten gefüllt werden, sondern nach einem bestimmten wiederholung eine neue Datei erstellt und gefüllt werden. Z.B. ich gebe das Tool so ein</p>
<p>testtool -f Dateiname -n 100</p>
<p>das Tool soll nun die Datei &quot;Dateiname_1&quot; erstellen und die ersten 100 Werte darin schreiben. Danach soll es die Datei &quot;Dateiname_1&quot; schließen und die Datei &quot;Dateiname_2&quot; öffnen und die nächsten 100 Werte dort ablegen usw.</p>
<p>wie bewerkstellige ich dies nun??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271945/nach-bestimmter-zahl-in-neue-datei-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 03:32:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271945.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Aug 2010 16:10:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Fri, 06 Aug 2010 16:10:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bin ein echter newbe, doch möchte ich nun einen Aufgabe lösen.<br />
Der Titel ist warscheinlich nicht aussagekräftig. Daher hier die Fragestellung:</p>
<p>ich hab ein Programm das Werte errechnet und in eine Datei schreibt, wenn man dem Programm als Argument den Dateinamen übergibt. Nun soll aber nicht eine einzige Datei mit den Werten gefüllt werden, sondern nach einem bestimmten wiederholung eine neue Datei erstellt und gefüllt werden. Z.B. ich gebe das Tool so ein</p>
<p>testtool -f Dateiname -n 100</p>
<p>das Tool soll nun die Datei &quot;Dateiname_1&quot; erstellen und die ersten 100 Werte darin schreiben. Danach soll es die Datei &quot;Dateiname_1&quot; schließen und die Datei &quot;Dateiname_2&quot; öffnen und die nächsten 100 Werte dort ablegen usw.</p>
<p>wie bewerkstellige ich dies nun??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937172</guid><dc:creator><![CDATA[wh.for]]></dc:creator><pubDate>Fri, 06 Aug 2010 16:10:03 GMT</pubDate></item><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Fri, 06 Aug 2010 16:42:59 GMT]]></title><description><![CDATA[<p>du rufst nacheinander das programm auf:<br />
<code>testtool -f Dateiname_1 -n 100</code><br />
<code>testtool -f Dateiname_2 -n 200</code><br />
ich vermute mal, es wird keinen parameter geben, wo du den start ausgeben kannst.</p>
<p>also wirst du danach die dateien alle wieder öffnen müssen und die ersten 100*n einträge entfernen.</p>
<p>vll also auch:<br />
<code>testtool -f Dateiname_temp -n 10000</code><br />
und dann die Dateiname_temp öffnen und jeweils 100 Werte lesen und in eine Datei schreiben, dann die nächste etc.</p>
<p>evtl. lohnt sichs auch, nen kleinen betrachter dazu zu schreiben. der halt die ganze datei öffnet und dir ne html-seite oder iwie so was ausgibt - je nach dem, was du genau möchtest...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937190</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 06 Aug 2010 16:42:59 GMT</pubDate></item><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Fri, 06 Aug 2010 17:22:46 GMT]]></title><description><![CDATA[<p>Ich glaube, ich würde die Dateinamen mit Stringstreams basteln.<br />
<a href="http://www.cplusplus.com/reference/iostream/ostringstream/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ostringstream/</a></p>
<pre><code class="language-cpp">char* filename=...
ofstream out(filename);
</code></pre>
<p>jetzt</p>
<pre><code class="language-cpp">ostrstream longfilename;
longfilename&lt;&lt;filename&lt;&lt;'_'&lt;&lt;filenumber;
ofstream out(longfilename.str().c_str());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1937206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937206</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 06 Aug 2010 17:22:46 GMT</pubDate></item><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Fri, 06 Aug 2010 17:31:00 GMT]]></title><description><![CDATA[<p>für mich klang das eher so, als ob er das programm nicht selbst geschrieben hätte - ist also vermutlich nicht das, was er wissen wollte<sup>.</sup></p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937211</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 06 Aug 2010 17:31:00 GMT</pubDate></item><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Fri, 06 Aug 2010 19:09:43 GMT]]></title><description><![CDATA[<p>unskilled: ich möchte nicht extra arbeit schaffen, jedes mal wenn ich das Programm starte. Es ist auch unklar wieviele werte das Programm erzeugt.</p>
<p>volkard: momentan steht folgendes im code (hab ich von einem anderen Programm)</p>
<pre><code>if (strncmp(argv[i],&quot;-f&quot;,2)==0)
{
  fout.open(argv[i+1]);
  flag = 1;
}

/*hier eine Schleife die den Wert errechnet*/

if (flag==1)
{
  fout.close();
}
</code></pre>
<p>wie müsste ich denn Code nun ändern?</p>
<p>ich wäre dir über eine recht genaue Angabe sehr sehr dankbar.</p>
<p>Ich bin da sehr Neu in dem Thema und würde dies gerne später auch für meine weiteren Programme nutzen.</p>
<p>:p :p :p :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937244</guid><dc:creator><![CDATA[wh.for]]></dc:creator><pubDate>Fri, 06 Aug 2010 19:09:43 GMT</pubDate></item><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Sat, 07 Aug 2010 16:36:23 GMT]]></title><description><![CDATA[<p>wh.for schrieb:</p>
<blockquote>
<p>wie müsste ich denn Code nun ändern?</p>
<p>ich wäre dir über eine recht genaue Angabe sehr sehr dankbar.</p>
<p>Ich bin da sehr Neu in dem Thema und würde dies gerne später auch für meine weiteren Programme nutzen.</p>
</blockquote>
<p>Hallo wh.for,</p>
<p>willkommen im C++-Forum.</p>
<p>wenn man etwas wieder verwenden möchte so bietet es sich u.U. an, es in eine oder mehrere Klassen zu implementieren. Du brauchst eigentlich zwei Dinge:<br />
1.) einen Dateinamen, den man 'hoch zählen' kann<br />
2.) eine 'Schreiber-Klasse', die automatisch eine neue Datei aufmacht, wenn die aktuelle Datei 'voll' ist.</p>
<p>Das könnte etwa so aussehen:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt; // std::ostringstream
#include &lt;string&gt;
#include &lt;cassert&gt;

class ZaehlenderDateiname
{
public:
    explicit ZaehlenderDateiname( const char* name, int nr1 = 1 )
        : m_nr( nr1 )
        , m_name( name )
    {}
    ZaehlenderDateiname&amp; operator++() // inkrement
    {
        ++m_nr;
        return *this;
    }
    std::string get() const
    {
        std::ostringstream buf;
        // hier wird der Dateiname zusammengebaut
        buf &lt;&lt; m_name &lt;&lt; &quot;_&quot; &lt;&lt; m_nr;
        return buf.str();
    }
private:
    int m_nr;
    std::string m_name;
};

class Schreiber
{
public:
    Schreiber( const char* filename, int anzahlProDatei )
        : m_filename( filename )
        , m_zahlenZaehler( 0 )
        , m_anzahlProDatei( anzahlProDatei )
        , m_file( new std::ofstream( m_filename.get().c_str() ) )
    {
        assert( m_file-&gt;is_open() );
    }
    ~Schreiber()
    {
        delete m_file; // schließt auch die Datei
    }

    void schreibeZahl( int zahl )
    {
        ++m_zahlenZaehler;
        if( m_zahlenZaehler &gt; m_anzahlProDatei )
        {
            // Datei ist voll; nächste Datei öffnen
            delete m_file; // schließt auch die bisherige Datei

            ++m_filename; // nächster Dateiname -&gt; operator++
            m_file = new std::ofstream( m_filename.get().c_str() );
            m_zahlenZaehler = 1; // die Zahl 'zahl' ist die erste in der Datei
            assert( m_file-&gt;is_open() );
        }
        *m_file &lt;&lt; zahl &lt;&lt; &quot;\n&quot;;
    }

private:
    // --   Kopieren verhindern; wg m_file
    Schreiber( const Schreiber&amp; );
    Schreiber&amp; operator=( const Schreiber&amp; );

    // --   member
    ZaehlenderDateiname m_filename;
    int m_zahlenZaehler; // zählt die zahlen in einer Datei
    int m_anzahlProDatei;
    std::ofstream* m_file;
};

int main( int argc, char* argv[] )
{
    using namespace std;
    assert( argc &gt; 2 );
    int anzahlProDatei;
    istringstream buf( argv[2] );
    buf &gt;&gt; anzahlProDatei;
    Schreiber schreiber( argv[1], anzahlProDatei );
    for( int zahl = 1; zahl &lt;= 150; ++zahl )
        schreiber.schreibeZahl( zahl );
    return 0;
}
</code></pre>
<p>wenn Du dazu Fragen hast, so stelle sie.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937441</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 07 Aug 2010 16:36:23 GMT</pubDate></item><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Mon, 09 Aug 2010 13:01:27 GMT]]></title><description><![CDATA[<p>Hallo Werner:<br />
Danke für deine Hilfe. So wie du mir angeboten hast zu dem Code Fragen zu stellen, möchte ich dies nun nutzen.</p>
<pre><code class="language-cpp">explicit ZaehlenderDateiname( const char* name, int nr1 = 1 )
   : m_nr( nr1 )
   , m_name( name )
{}
</code></pre>
<p>Hier hast du den Konstruktor mit einem „explicit“ versehen und anschließend die Variablen (ich vermute mal es sind Variablen) m_nr und m_name angehängt. Solch eine Schreibweise und Zuweisung habe ich bisher noch nie gesehen. Wie funktioniert dies.</p>
<pre><code class="language-cpp">ZaehlenderDateiname&amp; operator++()
</code></pre>
<p>Beim zweiten Konstruktor ist mir „&amp; operator++()“ unklar und wo es Verwendung findet im Programm.</p>
<pre><code class="language-cpp">Schreiber( const char* filename, int anzahlProDatei )
   : m_filename( filename )
   , m_zahlenZaehler( 0 )
   , m_anzahlProDatei( anzahlProDatei )
   , m_file( new std::ofstream( m_filename.get().c_str() ) )
{
   assert( m_file-&gt;is_open() );
}
</code></pre>
<p>In der Kasse „Schreiber“ verstehe ich „m_file(new std::ofstream(m_filename.get().c_str()))“ nicht und was „assert(m_file-&gt;is_open())“ bewirkt.</p>
<pre><code class="language-cpp">~Schreiber()
{
   delete m_file; // schließt auch die Datei
}
</code></pre>
<p>Kommt der Destruktor beim Ende des gesamten Proramms zum Zug?</p>
<pre><code class="language-cpp">*m_file &lt;&lt; zahl &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Was macht „*m_file&lt;&lt;zahl&lt;&lt;“\n“</p>
<pre><code class="language-cpp">// --   Kopieren verhindern; wg m_file
    Schreiber( const Schreiber&amp; );
    Schreiber&amp; operator=( const Schreiber&amp; );
</code></pre>
<p>Hier würde ich vermuten das dies eine Schleife darstellt, hab aber absolut keine Ahnung?</p>
<p>Ich hab zwar noch ein paar Fragen, möchte aber erst einmal dies Verstehen. Vielleicht verstehe ich ja den Rest dann von allein.</p>
<p>Danke nochmals für deine Hilfe. <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/1937928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937928</guid><dc:creator><![CDATA[wh.for]]></dc:creator><pubDate>Mon, 09 Aug 2010 13:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to nach bestimmter zahl in neue Datei schreiben on Mon, 09 Aug 2010 16:43:08 GMT]]></title><description><![CDATA[<p>wh.for schrieb:</p>
<blockquote>
<p>Hallo Werner:<br />
Danke für deine Hilfe. So wie du mir angeboten hast zu dem Code Fragen zu stellen, möchte ich dies nun nutzen.</p>
</blockquote>
<p>Oh je, da habe ich mich ja wieder auf was eingelassen <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="😉"
    /><br />
Bevor ich anfange: Praktisch alle Deine Fragen betreffen die Syntax von C++. D.h. Du bist ein Newbee (hattest Du geschrieben), und dann ist selbst dies 'unscheinbare' Programm welches Du schreiben willst, eigentlich schon zu schwer für Dich.</p>
<p>Du solltest also zunächst ein Tutorial oder ein Buch durcharbeiten, und Dich an die Beispiele halten, die dort beschrieben sind. Achte dabei auf die Qualität - da ist recht viel Schrott im Umlauf - gut sollen u.a. die Bücher von Breymann und der C++-Primer sein. Du kannst Dich hier im Forum unter [<a href="http://www.c-plusplus.net/cms/modules.php?op=modload&amp;name=mbBooks&amp;file=index" rel="nofollow">Bücher</a>] informieren.</p>
<p>wh.for schrieb:</p>
<blockquote>
<pre><code class="language-cpp">explicit ZaehlenderDateiname( const char* name, int nr1 = 1 )
   : m_nr( nr1 )
   , m_name( name )
{}
</code></pre>
<p>Hier hast du den Konstruktor mit einem „explicit“ versehen und anschließend die Variablen (ich vermute mal es sind Variablen) m_nr und m_name angehängt. Solch eine Schreibweise und Zuweisung habe ich bisher noch nie gesehen. Wie funktioniert dies.</p>
</blockquote>
<p>zwei Sachen: das 'explicit' ist ein C++-keyword welches festlegt, dass der Konstruktor nicht für eine implizite Konvertierung taugt. Wenn man das 'explicit' weglässt, so wäre z.B. dies möglich:</p>
<pre><code class="language-cpp">ZaehlenderDateiname name = &quot;EinName&quot;;
</code></pre>
<p>dies könnte aber auch gar nicht erwünscht sein, und somit ein Fehler sein; deshalb das 'explicit' und der obige Ausdruck liefert einen Compile-Fehler.</p>
<p>mit dem ':' beginnt dann die Initialisierungsliste, dort werden die Member der Klasse initialisiert. Suche hier im Forum nach 'Initialisierungsliste'.</p>
<p>wh.for schrieb:</p>
<blockquote>
<pre><code class="language-cpp">ZaehlenderDateiname&amp; operator++()
</code></pre>
<p>Beim zweiten Konstruktor ist mir „&amp; operator++()“ unklar und wo es Verwendung findet im Programm.</p>
</blockquote>
<p>.. hate ich mir schon gedacht, deshalb habe ich das in Zeile 55 hingeschrieben. 'ZaehlenderDateiname&amp;' ist die Referenz auf ein Objekt der Klasse 'ZaehlenderDateiname'. Das ist hier der Returntyp der Methode 'operator++()' - und ist das gleiche als ob Du schreibst:</p>
<pre><code class="language-cpp">int i=2;
    ++i; // &lt;- hier wird der operator++ aufgerufen
</code></pre>
<p>wh.for schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Schreiber( const char* filename, int anzahlProDatei )
   : m_filename( filename )
   , m_zahlenZaehler( 0 )
   , m_anzahlProDatei( anzahlProDatei )
   , m_file( new std::ofstream( m_filename.get().c_str() ) )
{
   assert( m_file-&gt;is_open() );
}
</code></pre>
<p>In der Kasse „Schreiber“ verstehe ich „m_file(new std::ofstream(m_filename.get().c_str()))“ nicht und was „assert(m_file-&gt;is_open())“ bewirkt.</p>
</blockquote>
<p>ich schreibe gern alles in eine Zeile .. 'm_file( new std::ofstream( m_filename.get().c_str() ) )' steht für:</p>
<pre><code class="language-cpp">std::string filenameAsString m_filename.get(); // liefert den neuen Filenamen als std::string
    const char filenameAsCharPtr = filenameAsString.c_str();
    std::ofstream* filePtr = new std::ofstream( filenameAsCharPtr ); // erzeuge ein std::ofstream-Objekt auf dem Heap
    m_file( filePtr ) // Pointer im Member 'm_file' merken
</code></pre>
<p>wh.for schrieb:</p>
<blockquote>
<pre><code class="language-cpp">~Schreiber()
{
   delete m_file; // schließt auch die Datei
}
</code></pre>
<p>Kommt der Destruktor beim Ende des gesamten Proramms zum Zug?</p>
</blockquote>
<p>i.A. schon vorher - in diesem Fall, wenn das Objekt 'schreiber' welches in Zeile 82 erzeugt wird, den Scope verlässt, also in Zeile 86</p>
<p>wh.for schrieb:</p>
<blockquote>
<pre><code class="language-cpp">*m_file &lt;&lt; zahl &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Was macht „*m_file&lt;&lt;zahl&lt;&lt;“\n“</p>
</blockquote>
<p>gibt eine Zahl 'zahl' und den Text &quot;\n&quot; (End Of Line) auf dem std::ostream *m_file aus. Wie würdest Du eine Zahl ausgeben?</p>
<p>wh.for schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// --   Kopieren verhindern; wg m_file
    Schreiber( const Schreiber&amp; );
    Schreiber&amp; operator=( const Schreiber&amp; );
</code></pre>
<p>Hier würde ich vermuten das dies eine Schleife darstellt, hab aber absolut keine Ahnung?</p>
</blockquote>
<p>Nein, mit einer Schleife hat das nichts zu tun - ignoriere es erst mal; es stellt sicher, dass Du nicht aus Versehen die Klasse Schreiber falsch verwendest.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938002</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 09 Aug 2010 16:43:08 GMT</pubDate></item></channel></rss>