c++ formázott kimenet, és ékezetes karakterek?

 ( pelz | 2008. január 21., hétfő - 14:09 )

Sziasztok!

1, Van-e a c++ nyelvben lehetőség formázott kimenetre, úgy mint a c-ben a printf() függvény? Tudom, hogy a printf() továbbra is rendelkezésre áll. A kérdés, hogy a "cout" tudja-e?

2, A c is, és a c++ is rosszul viszonyúl az ékezetes karakterekhez (legalábbis UBUNTU Linux esetén). Két karakternek számolja őket. Így pl. "ház" hosszának 4-et ad vissza nem 3-at. Ti hogy oldottátok meg a problámát?

Előre is kösz a válaszokat! Üdv: Pelci.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

1. iomanip
2. utf8-cpp

1) C++ kimenő folyam formázása:
Az ios (ios_base char–ra specializált változata) különböző jelzőket tartalmaz, amik befolyásolják a folyam formázását
Jelzők:

ios::skipws – elválasztó karakterek kihagyása
ios::showbase – számrendszer ábrázolása
ios::showpoint – tizedespont lebegőpontos számoknál
ios::uppercase – nagybetűs A-F és E
ios::showpos – írja ki a „+” jelet pozitív számoknál

Függvények, amikkel lekérhető/állítható:

fmtflags ios::flags();
fmtflags ios::flags(fmtflags newflags);
fmtflags ios::setf(fmtflags ored_flag);
fmtflags ios::unsetf(fmtflags clear_flag);

Szélesség, kitöltés és pontosság:
Függvényekkel lekérhető/állítható:

int ios::width() – aktuális szélesség
int ios::width(int n) – szélesség beállítás
int ios::fill() – aktuális kitöltő karakter
int ios::fill(int n) – kitöltő karakter beállítás
int ios::precision() – aktuális lebegőpontos pontosság
int ios::precision(int n) – lebegőpontos pontosság beáll.

Függvényhívások helyett manipulátorokkal is formázható a folyam:

Használhatók a "<<" és ">>" operátorokkal egy kifejezésen belül
Paraméter nélküliek:

showbase, noshowbase – számrendszer ábrázolása
showpos, noshowpos – írja ki a „+” jelet pozitív számoknál
uppercase, nouppercase – nagybetűs A-F és E
showpoint, noshowpoint – tizedespont lebegőpontos számoknál
skipws, noskipws – elválasztó karakterek kihagyása
left, right, internal – igazítás
scientific, fixed – számformátum

Paraméterrel rendelkezők – effektorok:

setioflags(fmtflags n) – n-ben levő jelzőket állítja be
resetioflags(fmtflags n) – töröl minden jelzőt, majd az n-ben levő jelzőket állítja be
setbase(base n) – melyik számrendszerben ábrázolja
setfill(char n) – kitöltő karakter beállítás
setprecision(int n) – pontosság beállítás
setw(int n) – szélesség beállítás

Példa függvényekre:

#include <sstream>
using namespace std;
void main() {
ostringstream os;
os << (float)10 << endl;
os.setf(ios::showpos|ios::showpoint);
os << (float)10 << endl;
os.precision(5);
os << (float)10 << endl;
os << 0x10 << endl;
os.setf(ios::hex,ios::basefield);
os << 0x10 << endl;
string result = os.str();
}

Ugyanez a példa manipulátorokra:

#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;
void main() {
ostringstream os;
os << (float)10 << endl;
os << showpos << showpoint << (float)10 << endl;
os << setprecision(5) << (float)10 << endl;
os << 0x10 << endl;
os << hex << 0x10 << endl;
string result = os.str();
cout << result << endl;
}

Egyébként speciális függvényeket és manipulátorokat saját magad is írhatsz.

Az ékezetes problémával még nem foglalkoztam, és most sajna nincs időm rá, de elképzelhetőnek tartom, hogy template traits-el felül kell definiálnod a méret vizsgáló függvényt, amit használsz.
____________________________________________________________
Slackware 12/current - linux-2.6.23.12-olorin - KDE 3.5.8

Srácok!

Köszönöm az értékes hozzászólásokat!