Formatierte Ausgabe in c++ ??
lima-city → Forum → Programmiersprachen → C/C++ und D
ausgabe
bestimmte manipulatoren
borland
buffer
count
dez
doubeln
format
formatierte ausgabe
funktion
genauigkeit
kleines beispiel
main
nes
nummer
po
punkten
sagtest
sofort
standard
-
Hab folgendes Problem.
Soll in unserem Fach c++, in der schule, etwas zur ?Formatierte Ausgabe in c++? schreiben. Nun hab ich aber kein plan was man da alles Hineinschreiben kann. W?rde mich freuen wenn ihr mir sagen k?nntet was man so f?r Bereiche in dieses Thema nehmen kann und evt. Seiten habt wo es etwas erkl?rt ist.
Mit freundlichen Gr??en
Max
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Naja, du kannst bei der Ausgabe bestimmte Manipulatoren mit angeben, mit denen du die Ausgabe formatieren kannst. Da w?ren z.B. setw f?r die Mindestl?nge, setprecision f?r die Genauigkeit einer Gleitkommazahl, setfill f?r F?llzeichen und hex, oct, dez f?r die Zahlendarstellung.
Um mal ein kleines Beispiel zu bringen:
int i=42;
cout << setw(5) << setfill('_') << i << endl;
gibt
___42
aus.
Es gibt nat?rlich noch viele weitere Formatierungen. Eine Liste findest du z.B. unter http://www.cplusplus.com/ref/iostream/ostream/operatorltlt.html
Ganz so einfach und angenehm wie in C geht's mit C++ leider nicht. Daf?r kannst du hier komplett mit Streams arbeiten.
K?nntest also z.B. die verschiedenen Stream-Manipulatoren (Klasse ostream) vorstellen und was sie so bewirken.
HTH,
thw
Beitrag ge?ndert am 24.04.2006 18:25 von thw -
C++ Formatierte Ausgabe
Die Ausgabe in C++ erfolgt entweder ?ber cout (Objekt orientiert).
Nun erst einmal m?chte ich mich mit den Escape-Sequenzen befassen sie werden in Zeichenketten verwendet um beispielsweise ? anzuzeigen oder einen Signalton auszugeben.
Im Buch Seite 122.
Hier die wichtigsten Escape-Sequenzen:
Steuerzeichen Bedeutung
\a BEL (bell) - akustisches Warnsignal
\b BS (backspace) - setzt Cursor um eine Position nach links
\f FF(formfeed) - ein Seitenvorschub wird ausgel?st. Wird haupts?chlich bei Programmen verwendet, mit denen Sie etwas ausdrucken k?nnen.
\n NL (newline) - Cursor geht zum Anfang der n?chsten Zeile
\r CR (carriage return) - Cursor springt zum Anfang der aktuellen Zeile
\t HT (horizontal tab) - Zeilenvorschub zur n?chsten horizontalen Tabulatorposition (meistens acht Leerzeichen weiter)
\v VT (vertical tab) - Cursor springt zur n?chsten vertikalen Tabulatorposition
\" " wird ausgegeben
\' ' wird ausgegeben
\? ? wird ausgegeben
\\ \ wird ausgegeben
\0 NULL (ist die Endmarkierung eines Strings)
\nnn Ausgabe eines Oktalwerts (z.B. \033 = ESCAPE-Zeichen)
\xhh Ausgabe eines Hexdezimalwerts
Gehen wir nun weiter zu den Manipulatoren sie sind f?r die Formatierte Ausgabe wichtig. Nun einzelne Beispiele zu einigen Manipulatoren.
Das wohl uns bekannteste ist hierbei endl es bedeutet Newline und geht in der cout Ausgabe in den Anfang einer neuen Zeile. Ein Beispiel:
#include <iostream>
using namespace std;
int main ()
{
cout << "Dies ist eine"
<< " Text-Ausgabe"; //Ausgabe "Dies ist eine Text-Ausgabe"
cout << "Dies ist eine" << endl
<< "Text-Ausgabe"; //Ausgabe "Dies ist eine"
// "Text-Ausgabe"
return 0;
}
Es gibt einen weiteren Befehl und zwar setw(int n) oder cout.width (int n) kombinierbar mit cout << right; oder cout << left; . Aber hierzu auch ein kleines Beispiel:^
#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{
cout << " Test" << endl; // Test
cout << setw(10) << "Test"<< endl; // Test
cout.width (10);
cout << right;
cout << "Test" << endl; // Test
return 0;
}
Mit setfill(?#?) k?nnte man noch die F?llzeichen ab?ndern.
Nun kommen wir zu der Ausgabe von Dezimalen, Octalen und Hexerdezimalen Zahlen. F?r int Variablen ist diese Ausgabe ?ber cout leicht man verwendet hier wieder einen so genanten Manipulator. Ein Beispiel:
#include <iostream>
#include <iomanip>
using namespace std;
int t()
{
int x = 123;
cout << dec << x << endl //Ausgabe ?123?
<< oct << x << endl //Ausgabe ?173?
<< hex << x << endl; //Ausgabe ?7b?
cout << resetiosflags(ios::basefield)
<< setiosflags(ios::dec) << x << endl //Ausgabe ?123?
<< resetiosflags(ios::basefield)
<< setiosflags(ios::oct) << x << endl //Ausgabe ?173?
<< resetiosflags(ios::basefield)
<< setiosflags(ios::hex) << x << endl; //Ausgabe ?7b?
cout.setf(ios::hex,ios::basefield);
cout << x << endl; //Ausgabe ?7b?
return 0;
}
Als letztes m?chte ich noch die Genauigkeit einer Gleitkommazahl mit dem Befehl setprecision(15) aber ein Beispiel zum Erkl?ren:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n = 25;
double i = 3.141592653589793238462643;
cout << setprecision(n) //N Zeichen sollen ausgegeben werden Stellen
<< i << endl;
return 0;
}
Das hab ich jetzt so zusammengeschrieben hoffe das ist richtig so und evt kann das ja mal einer schnell nachpr?ffen. -
Kann man unter C++ Funktionen wie sprintf() und printf() nicht mehr verwenden? Die bieten doch auch ein reiches Angebot an Formatierungs-Optionen ...
-
Du k?nntest sogar, wenn bisschen kreativ bist, deine eigene Funktion zum Formatieren von Strings schreiben. Hier mal nen Denkansto?.
. #include <stdarg.h> #include <iostream.h> #include <string.h> #include <math.h> void FormatStrO(char *buffer, char *pFoString, int pBufSize, ...); char *GetInt(int pI); int main(int argc, char* argv[]) { char buffer[100]; FormatStrO(buffer,"%s Nummer %i!!",sizeof(buffer),"Hallo", 5897); cout << buffer; cin.get(); return 0; } void FormatStrO(char *buffer, char *pFoString, int pBufSize, ...) { va_list vl; va_start(vl,pBufSize); char *s_tmp; int i; //-------------------- while(*pFoString) { if(*pFoString == '%') { switch(pFoString[1]) { case 's': s_tmp = va_arg(vl,char *); for(i = 0; i < strlen(s_tmp); i++) { *buffer = s_tmp[i]; buffer++; } break; /*******************************************/ case 'i': s_tmp = GetInt(va_arg(vl,int)); for(i = 0; i < strlen(s_tmp); i++) { *buffer = s_tmp[i]; buffer++; } break; } pFoString+=2; } else { *buffer = *pFoString; pFoString++; buffer++; } *buffer = '\0'; } va_end(vl); } //--------------------------------------------------------------------------- /*************************** * Int to C-String * ***************************/ char *GetInt(int pI) { int count = 0, ze = 1, pos = 0; while(true) { if(pI % ze != pI) { count++; ze*=10; } else break; } char *tmp = new char[count+1]; for(; count > 0; count--) { tmp[pos] = '0' + (pI / (int)(pow(10, count) / 10)); pI = pI - (int)(pow(10, count) / 10) * (pI / (int)(pow(10, count) / 10)); pos++; } tmp[pos] = '\0'; return tmp; } //--------------------------------------------------------------------------- .
Au?erdem hei? C++ nicht das man C Funktionen meiden soll bzw. das pritf etc. nicht mehr zu C++ geh?ren. -
Dennoch geh?ren C-Funktionen wie printf oder sprintf nicht zur Standard-Bibliothek von C++. Wenn man diese verwendet, bekommt man am Ende so ein heilloses und unsch?nes Durcheinander von Programmiersprachen
-
Hmm na ja ich bin trotzdem der ?berzeugung das es manchmal n?tzlich oder einfach nicht anders zu realisieren ist. Z.b. kenn ich jetzt keine ?quivalente Funktion/Bibliotek zu va_arg, va_list, etc. / stdarg unter C++. Wenn ja verbessere mich bitte.
-
die funktion die du da geschrieben hast ist ja mal sowas von printf()...
wozu printf("%d %s",i,"hallo") wenn man auch cout<<i<<" hallo"; machen kann, was viel ?bersichtlicher ist... -
Wow 100 Punkte f?r Shok der Beitrag war ja mal wieder so was von ?berfl?ssig aber na ja:
um zur ?bersichtlichkeit mal zu kommen ... ich pers?nlich bin eher der Meinung das die Funktion printf diesen Punkt bekommt und anscheinend bin ich net der einzige der so denkt. Wenn man sich schon die OWL/VCL/CLX von Borland anschaut sticht einem der Type AnsiString und String ins Auge wo es auch eine solche Funktion gibt (Format extern PACKAGE AnsiString __fastcall Format(const AnsiString Format, const System::TVarRec* Args, const int Args_Size); ). Ist nun mal eine n?tzliche art was zu formatieren wenn man z.B.: mit Stringressourcen (.res) arbeitet. Au?erdem ist deine Aussage falsch printf gibt die Ausgabe sofort aus meine Funktion (die ?brigens nur ne Art Denkansto? war) nicht. Diese ist eher, wie du es so sch?n sagtest "... ja mal so was von sprintf()..."
-
dann ist sie halt sprintf das tut nix zur sache, aber wenn man lange ausgaben hat, dann finde ich printf, sprintf, etc. un?bersichtlich, weil man immer ans ende gucken muss um zu wissen was da eingesetzt wird.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage