ifstream und Zeilenumbruch! Geht das???



  • Morgen Freunde der Sonne,

    ich habe ein neues Problem bei meinen Textdateien einlesen. Die Textdatei besteht aus 5 Spalten, aber ich brauche nur jeweils die ersten 3 Spalten einer Zeile.

    3520.300787 -711.915602  366.150341 1 0.0000
     3516.652642 -711.888040  374.225124 1 0.0000
     3513.798165 -716.043380  378.510253 1 0.0000
     3506.332899 -749.335828  378.802538 1 0.0000
     3507.417533 -755.383725  373.462221 1 0.0000
    

    Einlesen tue ich die Datei mit

    datei.open(ist_datei, ios::in);
    	vektor *ist_werte = new vektor[zeilen];
        int i=0; int zeilen=40;
    
    	while (i<zeilen)
    	{
    		datei >> ist_werte[i].x >> ist_werte[i].y >> ist_werte[i].z;
    		cout << ist_werte[i].x << ist_werte[i].y << ist_werte[i].z << endl;
    		i++;
    	}
    
    	datei.close();
    

    Gibts nicht irgendwie sowas wie einen Zeilenumbruch wie bei cout. Sodass der automatisch in die nächste Zeile springt!

    Wäre echt super. Danke schonmal für die Mühe die ich euch mache...

    Ciao 😉



  • Das wäre ne mögliche lösung:

    #include <fstream>
    #include <vector>
    #include <string>
    #include <sstream>
    #include <iostream>
    
    struct data
    {
      double x;
      double y;
      double z;       
    };
    
    typedef std::vector<data> datalist;
    
    void parseline( std::string const & line , data & d )
    {
      std::istringstream istr(line);
      istr >> d.x >> d.y >> d.z;
      return;
    }
    
    int main(int argc, char *argv[])
    {
      std::ifstream ifs("scan.dat");
      std::string line;
      datalist dl;
      while(std::getline(ifs,line))
      {
        std::cout << line << std::endl;
        data d;
        parseline(line,d);
        std::cout.precision(10);
        std::cout << d.x << " " << d.y << " "<< d.z << std::endl << std::endl;
        dl.push_back(d);                             
      } 
    
      return EXIT_SUCCESS;
    }
    

    MfG



  • Danke für deine Mühe, werd' ich mir morgen in Ruhe zu Gemüte führen...

    Ciao



  • nicht wirklich oder

    void parseline( std::string const & line , data & d )
    {
      std::istringstream istr(line);
      istr >> d.x >> d.y >> d.z;
      return; // Pfui
    }
    


  • Was ist deiner Meinung nach daran so schlimm? Das passiert sowieso, es ist zwar überflüssig aber ändert auch rein gar nichts.

    MfG



  • Ungünstig ist beispielsweise, daß parseline keine Information darüber liefert, ob die Zeile denn nun wirklich Zahlen enthalten hat. Da du den State vom Stringstream vergisst, kannst Du keine Fehlerbehandlung machen.

    Weiterhin ist die Routine IMHO ein ziemlicher Performancekiller: warum nicht direkt von der Datei die ersten drei Zahlen lesen und dann einfach mittels ignore(...) den Rest ignorieren. Man kann auch die überflüssigen zahlen einfach einlesen und unbeachtet lassen.



  • Wenn du dir das mal genauer anschaust wirst du feststellen das ich auf sämtliche überprüfungen verzichtet habe. Weil ich ihm einen Weg gezeigt habe und keine entgültige Lösung. [edit]Das gilt auch für die Performance. ... [/edit]

    Ich bin der Meinung das das völlig ausreicht. Und ich werde mir angewöhnen in Zukunft einen Disclaimer zu meinen Beispielen zu posten. 🙄


Anmelden zum Antworten