1stellige Zahl zu 3 stellige zahl machen?



  • Hallo alle zusammen,

    wie kann ich bitte 1 stellige zahl zu drei stellige Zahl machen?
    ZB:
    1 -->001
    17-->017
    56--> 056
    ..
    danke in voraus



  • std::setw + std::setfill



  • void TxtAusgabe_Gl26(vector<int> &v)
    {
    	string zielDatei = "c:\\Users\\test_ausgabe.txt";
    	//ios::fmtflags neuesFormat= ios::left|ios::oct;
    	//ofstream datei(zielDatei.c_str(),ios::app);
    	if(!datei.is_open())
    	{
    		cerr << zielDatei << " Kann nicht geoeffnet werden!\n";
    		exit(-1);
    	}
    	datei.fill('0');
    	datei.width(3);
    	copy(v.begin(),v.end(),ostream_iterator<int>(datei.right,"   "));
    	datei<<"\n";
    }
    

    ich bekomme eine Fehlermeldung :
    error C2665: 'std::ostream_iterator<_Ty>::ostream_iterator' : none of the 2 overloads could convert all t

    was heisst das?



  • http://www.cplusplus.com/reference/iomanip/setfill/

    Versuchs mal nach dem Schema:

    std::cout << std::setfill ('x') << std::setw (10);
    


  • datei<<setfill('0')<<setw(3);
    copy(v.begin(),v.end(),ostream_iterator<int>(datei,"   "));
    datei<<"\n";
    

    -->Ergebnis:
    000 1 33 83 104 110 124 163 185 314 318 343 356 386 430 440 456 464 475 487 492
    001 32 50 21 6 14 39 22 15 3 46 2 7 56 4 25 13 030 44 10 16 8 11 12 5
    033 82

    0 wird nur bei ersten Zahl am anfang der Zeile



  • for (int i : v) datei<<"   "<<setfill('0')<<setw(3)<<i;
    

    ?



  • setw wirkt nur 1x auf die nächste Ausgabe. Ich würde halt nicht std::copy für Ausgaben verwenden.


  • Mod

    Das liegt da dran, dass setw nur für die nächste Operation gilt. Oder genauer gesagt: Es ist zwar permanent, aber operator<< (der ohnehin die einzige (Standard-)Operation ist, die auf width reagiert) muss jedes Mal width wieder auf 0 setzen, wenn er fertig ist.

    Abhilfe, um trotzdem copy und Iteratoren nutzen zu können, wäre, ein eigener Wrapper um den Iterator, der bei jeder Operation width neu setzt. Gibt's, wie immer, schon in Boost:
    http://www.boost.org/doc/libs/1_39_0/libs/iterator/doc/function_output_iterator.html



  • #include <boost/function_output_iterator.hpp>
    --> Die resoucen können nicht geöffnet werden!!!

    gibt es einen andere Weg?



  • Stumpf ist Trumpf:

    void write_integer( ostream& os, int Value )
    {
       if( Value < 0 )
       {
          Value = -Value;
          os << "-";
       }
       if( Value < 10 )       os << "00" << Value;
       else if( Value < 100 ) os << "0" << Value;
       else                   os << Value;
    }
    

    *duck und weg* 😃


  • Mod

    MaximGast schrieb:

    #include <boost/function_output_iterator.hpp>
    --> Die resoucen können nicht geöffnet werden!!!

    gibt es einen andere Weg?

    Boost installieren?

    Oder

    SeppJ schrieb:

    Abhilfe, um trotzdem copy und Iteratoren nutzen zu können, wäre, ein eigener Wrapper um den Iterator, der bei jeder Operation width neu setzt.



  • @DocShoe noch einen blöde Frage:

    void TxtAusgabe_Gl26(vector<int> &v)
    {
    	string zielDatei = "c:\\Users\\test_ausgabe.txt";
    	//ios::fmtflags neuesFormat= ios::left|ios::oct;
    	ofstream datei(zielDatei,ios::app);
    	//ofstream datei(zielDatei.c_str(),ios::app);
    	if(!datei.is_open())
    	{
    		cerr << zielDatei << " Kann nicht geoeffnet werden!\n";
    		exit(-1);
    	}
    	//copy(v.begin(),v.end(),ostream_iterator<int>(datei,"   "));
    //--> Wie soll ich die write_integer aufrufen??
    	for(size_t i= 0;i<v.size();++i)
    		write_integer(datei,v.at(i));
    //<--
    	datei<<"\n";
    }
    

    sorry 😞



  • Genau so... was geht denn nicht?



  • ich bekomme diese Fehlermeldung:
    error C3861: 'write_integer': identifier not found


  • Mod

    DocShoe schrieb:

    Stumpf ist Trumpf:

    void write_integer( ostream& os, int Value )
    {
       if( Value < 0 )
       {
          Value = -Value;
          os << "-";
       }
       if( Value < 10 )       os << "00" << Value;
       else if( Value < 100 ) os << "0" << Value;
       else                   os << Value;
    }
    

    *duck und weg* 😃

    Nutz da doch wenigstens intern setw, damit man nicht so eingeschränkt ist und auch das Füllzeichen noch ändern kann. Außerdem schreit dies meiner Meinung nach nach einer Implementierung als Funktor/Lambda.

    @Threadersteller: Ich bin gerade etwas verwirrt. Wie viel C++ kannst du überhaupt? Einerseits kommst du mit algorithms und Iteratoren an, andererseits scheinst du nicht in der Lage zu sein, einfachste Programme zu schreiben. Nenn mal bitte deinen Kenntnisstand, dann kann man passendere Antworten geben.



  • @Stepp :Nutz da doch wenigstens intern setw, damit man nicht so eingeschränkt ist und auch das Füllzeichen noch ändern kann. Außerdem schreit dies meiner Meinung nach nach einer Implementierung als Funktor/Lambda

    Ehrlich gesagt verstehe ich nicht was du meinst?

    😞



  • Damit meinte er auch mich, und nicht dich. Du sollst uns jetzt erst ein mal erzählen, wieviel C++ du wirklich kannst.

    @SeppJ
    Funktor wäre nicht mehr ganz so stumpf gewesen...



  • Ich bin nocn anfänger....
    Ich habe nicht Erfahrungen


  • Mod

    MaximGast schrieb:

    Ich bin nocn anfänger....
    Ich habe nicht Erfahrungen

    Warum fummelst du dann so komisch Streamiteratoren rum? Abgeschrieben? (Fall ja: Schlechte Idee zum Lernen.)

    Wieso nicht einfach die ganze Funktion weglassen und stattdessen:

    for(size_t i = 0; i < dein_vector.size(); ++i)
      zielstream << setw(3) << setfill('0') << dein_vector[i] << " ";
    

    Zwei Zeilen und fertig. So macht man das, wenn man gerade mit C++ angefangen hat. (Und später eigentlich auch. Dieses ostream_iterator-Gefummel benutzt niemand ernsthaft, außer er will den großen Haxx0r markieren.)



  • Ich habe das jetzt:

    datei.fill('0');
    for(size_t i= 0;i<v.size();++i)
    {
     datei.width(3);
     datei<<v[i]<< "   ";
    }
    

    Jede hat klein angefangen
    aber danke an alle 🙂


Log in to reply