Rundungsproblem beim Schreiben in File



  • Hallo,

    ich schreibe gerade ein Programm, dass ich für die Auswertung einer Messung brauche. Im Grunde macht das Programm folgende Dinge 1. Dateien einlesen 2. Verändern 3. abspeichern - beim abspeichern habe ich ein problem, da er meinen ersten Messwert rundet (der ist 13 Stellig und ich kriege immer ein e rein - was leider nicht das Ziel ist). Kann mir jemand helfen - der betreffenede Codeabschnitt ist unten angeführt!

    Danke!

    std::ofstream outfile;                // Output-Datei intiallisieren
    	std::stringstream out_data;
    	out_data<<filename.str()<<"all.txt"; // File zum Speichern
    	outfile.open (out_data.str(), ios_base::app);	
    	int h=0;
    
    	// Alles in eine Datei! 
    	for (int i=0; i<(channel_max+1); i++)
    		{	std::ifstream infile;       // Input-Datei initialisieren
    			std::stringstream raw_data;
    			if (i<10)
    				{raw_data.str("");
    				raw_data<<filename.str()<<"0"<<i<<".list";} //Filename zum Laden
    			else
    				{raw_data.str("");
    				raw_data<<filename.str()<<i<<".list";}
    			std::cout <<raw_data.str() << "\n" ;
    			infile.open (raw_data.str());
    			h=i;
    			while (check<1)
    			{	double a=0,b,c; 
    				infile>>a>>b>>c;
    				/*if (i/8<1)
    					timestemp=a;
    				if (i/8<2 && i/8>0.99)
    					timestemp=a+t_offset12;
    				if (i/8<3 && i/8>1.99)
    					timestemp=a+t_offset13;
    				if (i/8<4 && i/8>2.99)
    					timestemp=a+t_offset14;
    				if (i/8<5 && i/8>3.99)
    					timestemp=a+t_offset15;
    				if (i/8<6 && i/8>4.99)
    					timestemp=a+t_offset12; */
    				if (h<1.5)
    					{timestemp=a;}
    				if (h<2.5 && h>1.5)
    				{timestemp=a+t_offset12;}
    				 if (h<3.5 && h>2.5)
    				{timestemp=a+t_offset13;}
    				if (h<4.5 && h>3.5)
    				{timestemp=a+t_offset14;}
    				if (h<5.5 && h>4.5)
    				{timestemp=a+t_offset15;}
    				if (h<6.5 && h>5.5)
    					{timestemp=a+t_offset16;}
    				if (a>0)
    				{outfile << timestemp << "\t" << b <<"\t"<< c << "\t" << i << "\n" ;} // Schreiben der Outputdatei Reihenfolge [ t sg lg # ]
    				else
    					{check=1;} 
    			}
    			infile.close();
    			check=0;
    	}
    	outfile.close();
    


  • Hallo Lummel202,

    Willkommen im C++-Forum.

    Was Dir fehlt ist das Wissen über Manipulatoren für den Ausgabestream. Schau Dir mal setprecision, setw und setfill an.
    'timestamp' mit 'a'.

    Gruß
    Werner



  • Moin Lummel.
    Mit den Manipulatoren kannst Du auch dieses stringstream -Geraffel am Anfang vereinfachen.
    Ausserdem hilft Dir if-else-if beim formulieren des Hauptteils, der logisch auch nicht ganz schluessig, da bei Dir Lücken in den Bereichen sind - z.B. h == 3.5...
    Ungetestet, aber der Grundgedanke kommt rüber:

    std::ofstream outfile(filename + "all.txt", std::ios_base::app);
      // Alles in eine Datei!
      for (int i=0; i<(channel_max+1); i++)
        {
          std::stringstream raw_data(filename);
          raw_data << std::setfill('0') << std::setw(2) << i << ".list";
          std::cout << raw_data.str() << '\n';
          std::ifstream infile(raw_data.str());
          h=i;
          while (true)
            {
              double a,b,c;
              infile>>a>>b>>c;
              if (h < 1.5)
                timestamp = a;
              else if(h < 2.5)
                timestamp = a + offset12;
              else if(h < 3.5)
                timestamp = a + offset13;
              else if(h < 4.5)
                timestamp = a + offset14;
              else if(h < 5.5)
                timestamp = a + offset15;
              else if(h < 6.5)
                timestamp = a + offset16;
              if(0<a)
                outfile << timestamp << '\t' << b << '\t'<< c << '\t' << i << '\n' ;
              else
                break;
            }
        }
    

    Gott zum Gruße!



  • Hey,

    vielen Dank schoneinmal für das Antworten - allerdings verändere ich doch jetzt nur den filename meines Inputfiles - normalerweiße muss ich doch das outputfile verändern oder verstehe ich das falsch?



  • Lummel202 schrieb:

    Hey,

    vielen Dank schoneinmal für das Antworten - allerdings verändere ich doch jetzt nur den filename meines Inputfiles - normalerweiße muss ich doch das outputfile verändern oder verstehe ich das falsch?

    .. das verstehst Du richtig.
    Nur ist es für uns nicht ganz offensichtlich wo das stattfindet. Ich vermute in Zeile 48:

    {outfile << timestemp << "\t" << b <<"\t"<< c << "\t" << i << "\n" ;} // Schreiben der Outputdatei Reihenfolge [ t sg lg # ]
    

    da passt der Kommentar aber nicht zum Inhalt. Geschrieben wird 'timestemp b c i' Kommentar: 't sg lg #' ??

    Es reicht wahrscheinlich hinter Zeile 4 ein

    outFile << setpresision(13); // Fliesskommaausgabe mit 13 Dezimalstellen
    

    hinzuzufügen. Erfordert ein #include <iomanip>.

    Falls Du kein Scientific-Format sondern nur festes Format habe willst, so füge noch ein:

    outFile << fixed;
    

    - dann sind es aber 13 Nachkommastellen (s. fixed).

    Gruß
    Werner



  • Ahh Sorry, hatte das einbinden des outfiles nicht mitkopiert, das steht direkt darüber:

    std::ofstream outfile;                // Output-Datei intiallisieren
    	std::stringstream out_data;
    	out_data<<filename.str()<<"all.list"; // File zum Speichern
    	outfile.open (out_data.str(), ios_base::app);	
    	int h=0;
    


  • Lummel202 schrieb:

    std::ofstream outfile;                // Output-Datei intiallisieren
    	std::stringstream out_data;
    	out_data<<filename.str()<<"all.list"; // File zum Speichern
    	outfile.open (out_data.str(), ios_base::app);	
    	int h=0;
    

    Die Zeilen habe ich mir erlaubt in eine zusammenzufassen.
    Siehe erste Zeile im Code oben. Die wahrscheinlich richtig so aussehen müsste (ist filename auch ein stringstream ?):

    std::ofstream outfile(filename.str() + "all.txt", std::ios_base::app);
    

    Beachte bitte, dass ich weitestgehend nur eine Umformung Deines Codes vorgenommen habe - also strengenommen "Off-topic" bin.
    Werners Beiträge hingegen befassen sich mit Deinem Problem mit der Formatierung/Rundung.

    Sorry, wenn das mehr verwirrt als hilft.



  • Vielen Dank an alle es hat geklappt!


Anmelden zum Antworten