Streams umkehren?



  • Hallo, ich schreibe gerade einen eigene kleine DXF (Autocad Vektor Format) Parser. Ich muß also Formatiert in ein File schreiben.

    z.B.:

    void CDxf::WriteVertex( int xPos, int yPos )
    {
    	ofstream FichierDxf (m_strFilenameBuff, ios::app);
    	FichierDxf << 0          << endl;
    	FichierDxf << "VERTEX"   << endl;
    	FichierDxf << 8          << endl;	// Group code for layer name
    	FichierDxf << m_iActiveLayer	<< endl;	// Layer number
    	FichierDxf << 10		 << endl;
    	FichierDxf << xPos		 << endl;
    	FichierDxf << 20		 << endl;
    	FichierDxf << yPos		 << endl;
    	FichierDxf.close();
    }
    

    Speichert mir einen Vertex. Nun ist Die Frage nach dem Laden. Ich könnte einfach eine ReadVertex - Funktion basteln, die per ( copy Paste 😮 ) einen Lade Stream entspreched des Speicher Streams aufruft. Ich möchte aber auch nicht für jedes Draw Primitiv eine eigene Struktur anlegen müssen. Könnte ich die dann eigentlich problemlos formatiert wie oben abspeichern? Im beispiel aus der FAQ wurde ja alles binär gespeichert.

    Irgendwelche Ideen, die nicht wie meien eigenen sofort ein ungutes Gefühl aufkommen lassen 🙂

    Vielen Dank



  • Ich würde erstmal endl durch '\n' ersetzen

    Ansonsten verstehe ich das Problem nicht - du kannst natürlich genauso einlesen wie du ausgegeben hast...



  • Ich würde erstmal endl durch '\n' ersetzen

    Dumm gefragt: Wieso?

    Ansonsten verstehe ich das Problem nicht - du kannst natürlich genauso >einlesen wie du ausgegeben hast...

    Schon richtig, dann habe ich aber zweimal im Prinzip den gleichen Code - Block, bis auf die Richtung des streams - ändere ich einen von beiden, muß ich auch den anderen ändern. Da das bei jedem Draw - Primitiv (Kreise, Polylinie....) vorkommt habe ich jede menge quasi doppelten Code ala:

    void CDxf::WriteVertex( int xPos, int yPos, BOOL bRead )
    {
        if(!bRead)
        {
          ofstream FichierDxf (m_strFilenameBuff, ios::app);
          FichierDxf << 0          << endl;
          FichierDxf << "VERTEX"   << endl;
          FichierDxf << 8          << endl;    // Group code for layer name
          FichierDxf << m_iActiveLayer    << endl;    // Layer number
          FichierDxf << 10         << endl;
          FichierDxf << xPos         << endl;
          FichierDxf << 20         << endl;
          FichierDxf << yPos         << endl;
          FichierDxf.close();
        }
        else if(bRead)
        {
          char buff[64];
          ifstream FichierDxf( m_strFilenameBuff, ios::app );
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf >> buff;
          FichierDxf.close();
        }
    }
    

    Lassen wir mal das fehlende Fehlerhandling außer Acht (es schreibt sich in dem Fenster nicht so doll). buff würde ich jetzt jedesmal in den gewünschten Typ casten und auslesen. Ändere ich oben was, muß ich es auch unten ändern. Naja, jetzt wo ich die Variante so vor mir sehe - so schlecht ist sie gar nicht (hatte mein bishereiges Codegerüst mit seperaten Read - Write - Funktionen).



  • Dann machs doch so

    template<class Type>
    void Foo::ReadWrite(Type& rw)
    {
      rw.action(a);
      rw.action(b);
      rw.action(c);
    }
    
    class Reader
    {
    private:
      ifstream f;
    public:
      Reader(char const* name) : f(name){}
      template<typename T>
      void action(T& t)
      {
        f>>t;
      }
    };
    
    class Writer
    {
    private:
      ofstream f;
    public:
      Reader(char const* name) : f(name){}
      template<typename T>
      void action(T& t)
      {
        f<<t<<'\n';
      }
    };
    

    endl == '\n'<<flush
    verhindert also eine pufferung



  • Also würdest du immer \n nutzen anstatt endl?



  • Kommt darauf an, ob du gleichzeitig den Puffer leeren willst, oder nicht.



  • @Shade:

    Auch wenn ich 'ne Weile gebraucht habe das für meinen Fall zu übersetzen, aber der Ansatz gefällt mir.

    Ich wollte ursprünglich die einzelnen Primitive eben nicht in Klassen kapseln, aber das ist wohl das vernünftigste, zwecks Erweiterbarkeit. Jede Primitiv -Instanz bringt somit ihren eigene Load / Save - Syntax mit.


Anmelden zum Antworten