2 Vektoren in der gleiche xls-Datei schreiben



  • hallo
    In meinem Programm habe ich den Inhalt des Vektors "vec1" in der erste Spalte der excel-Datei "xdat.csv" geschrieben . Der Code sieht folgendes aus:

    fstream myfile("xdat.csv", std::ios::out);   //als Ausgabedatei
      if(!myfile) 
         return 20; 
      copy(vec1.begin(),vec1.end(),ostream_iterator<double>(myfile,",\r")); 
    
      myfile.close(); // Datei schliessen
    

    meine Frage lautet: wie kann ich jetzt den Inhalt eines zweiten Vektors "vec2" in die zweite Spalte derselbe Datei "xdat.csv" schreiben
    vielen vielen Dank



  • Edit: Mist - habs falsch verstanden...



  • das würde erst den kompletten Inhalt von vec1 in eine Zeile packen, danach den ersten von vec2 ind die gleiche Zeile und dann anfangen in die nächste Spalte zu schreiben, wenn ich die ",\r" und ",;" für excel richtig verstanden hab.

    Ich würd auf die bequemlichkeit von copy verzichten und sowas bringen wie

    for(i1 = vec1.begin(), i2=vec2.begin();
        i1 != vec1.end() && i2 != vec2.end();
        i1++, i2++)
      {
      myfile << *i1 << ",;" << *i2 << ",\r";
      }
    

    Wenn du ganz viel Spaß in den Backen hast, könntest du natürlich einen "Doppeliterator" implementieren, der als Konstruktor ein pair aus zwei Iteratoren bekommt und als inkrementoperator beide inkrementiert etc. Als Rückgabewert der Dereferenzierung müsste natürlich eine Abart von pair<> kommen (du musst ja beide Werte zurückgeben), für die ein operator<< definiert ist, damit der ostream_operator sie auch auf seinen ostream packen kann. Der Vorteil?
    Öhm, naja. Vielleicht dass du das Dingen dann schachteln kannst?

    template<class T1, T2>
    class Ausgabepair : public pair<T1, T2>;
    ostream& operator<<(ostream& os, Ausgabepair& ap)
      { os << ap.first << ",;" << ap.second; return os; };
    
    template<class InIt1, InIt2>
    class DoppelIterator
      {
      public:
      DoppelIterator(InIt1& it1, InIt2& it2);
      DoppelIterator(DoppelIterator& rhs);
      DoppelIterator& operator=(DoppelIterator& rhs);
      DoppelIterator& operator=(pair<InIt1,InIt2>& rhs);
      DoppelIterator& operator++();
      DoppelIterator operator++(int);
      //...
      Ausgabepair<T1, T2> operator*();
      }
    
    main()
      {
      //...
      typedef DoppelIterator<DoppelIterator<typename vector<int>::iterator, typename vector<double>::iterator>, vector<char>::iterator >   Dreieriterator;
    
      Dreieriterator i = (make_pair(make_pair(intvec.begin(),doublvecbegin()),charvec.begin())
    
      copy(i, //ne gute definition für i.end(), ostream_iterator<double> //...)
      }
    

    Ähm also. Es ginge bestimmt. Irgendwie. Wers schafft kriegt n Bier 😉

    }



  • @pumuckl
    Danke für die Antwort.

    for(i1 = vec1.begin(), i2=vec2.begin(); 
        i1 != vec1.end() && i2 != vec2.end(); 
        i1++, i2++) 
      { 
      myfile << *i1 << ",;" << *i2 << ",\r"; 
      }
    

    könnte mir jemand sagen was für n Datentyp haben die var i1 und i2 ?!!!
    Danke sehr



  • Das sind Iteratoren.
    da ich mal annehme, dass vec1 und vec2 vom typ vector<double> sind, sind i1 und i2 entsprechend vector<double>::iterator



  • @pumuckl
    das funzt wunderbar
    du hast meinen Tag gerettet.
    vielen Dank
    weiter so!



  • np 🙂



  • pumuckl schrieb:

    Ähm also. Es ginge bestimmt. Irgendwie. Wers schafft kriegt n Bier 😉

    Hallo Pumuckl,

    wie wär's damit

    #include <iostream>
    #include <locale>
    #include <fstream>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    
    struct Zeile
    {
        Zeile( double sp1, double sp2 )
            : m_sp1( sp1 )
            , m_sp2( sp2 )
        {}
        friend std::ostream& operator<<( std::ostream& out, const Zeile& zl )
        {
            return out << zl.m_sp1 << ";" << zl.m_sp2;
        }
        static Zeile make( double sp1, double sp2 )
        {
            return Zeile( sp1, sp2 );
        }
    private:
        double m_sp1, m_sp2;
    };
    
    int main()
    {
        using namespace std;
        vector< double > vec1;
        vector< double > vec2;
        vec1.push_back( 1.2 );
        vec1.push_back( 3.4 );
        vec1.push_back( -5.6 );
        vec2.push_back( 156.01 );
        vec2.push_back( -0.8 );
        vec2.push_back( 18.0 );
    
        ofstream out("xdat.csv");
        out.imbue( std::locale("German") ); // für die deutsche Version von Excel
        transform( vec1.begin(), vec1.end(), vec2.begin(), 
            ostream_iterator< Zeile >( out, "\n" ), &Zeile::make );
        return 0;
    }
    

    Krieg' ich jetzt 'n Bier?
    😋 Werner



  • Hallo,

    erstmal danke für dieses Super Codeausschnitt er funktioniert einwandfrei.

    Habe Ihn auch so erstmal 1:1 übernommen.
    Meine Frage.

    Wie kann ich ein Array von Messdaten in die datei schreiben.
    Bzw während einer Bewegung sollen mehrere Messdaten aufgenommen werden(mehrer Bilder) und diese jeweils in einem Array gespeichert werden.
    Das entstandene große Array mit allen Messungen soll dann in Excel gespeichert werden.

    Habt Ihr ne Idee wie ich dies am Besten umsetzte damit das ganze schnellstmöglich passiert ?

    LG


  • Mod

    Bitte keine Uraltthreads auskramen, um dann eine nur gering mit dem Thema verwandte Frage zu stellen. Mach einen neuen Thread mit einer präzisen Problembeschreibung und Fragestellung auf.


Log in to reply