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 twas 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 820 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.
-
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*
-
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
-
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
-
MaximGast schrieb:
Ich bin nocn anfänger....
Ich habe nicht ErfahrungenWarum 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
-
Sieht doch gleich viel besser aus. Und funktioniert nach Wunsch, nehme ich an?