Bertel Lund Hansen wrote:
> Jeg har lært C i 1. og 2. semester. Her i 4. har jeg så valgt
> C++. Jeg havde glædet mig til at få en nemmere håndtering af
> strenge, og det er der da også, men at få en formatteret udskrift
> er åbenbart langt nemmere med printf - at skrive i hvert fald.
> Det kan jo godt ske at den færdige kode er på højde med
> kompileret C-kode.
>
> Er det mig der er for konservartiv, eller hva'?
Nja. Det er rigtigt, at hvis du ønsker at udskrive dine data i
kolonner med venstre-højre justering og med et bestemt antal
decimaler, så er printf nemmere:
printf("%-40s\n%2f", "Felt på 40 tegn", 123.456)
sammenlignet med
cout << setw(40) << "Felt på 40 tegn" << endl
<< setprecision(2) << 123.456 << endl;
(du skal være opmærksom på, at der endnu ikke er særligt mange
compilere, der implementerer alle manipulatorer. gcc-2.x gør
ikke. gcc-3.x gør.
Men jeg synes, det opvejes af mulighederne for at behandle dine
egne typer, som var de indbygget i srpoget. F.eks:
struct Date {
int year, month, day;
Date(int year, int month, int day)
: year(year), month(month), day(day)
{}
friend ostream& operator<<(ostream& out, const Date& d) {
out << year << "-" << month << "-" << day;
return out;
}
};
int main() {
Date dato(2002, 4, 10);
cout << "Der er i dag d. " << dato << endl;
}
Boost (
www.boost.org) har gang i en printf lignende udvidelse til
cout m.fl, så kan kan skrive noget i stil med:
cout << "Det er i dag d. " << dato << endl
<< format("%-40s", "Felt på 40 tegn") << endl
<< format("%2f", 123.456) << endl;
Altså det bedste fra C/C++ kombineret (bortset fra, at de så vidt
jeg kan læse mig frem til har valgt en strækkelig syntax). Boost
versionen af printf er endnu ikke en del af deres library, men
den kommer nok i løbet af få måneder.
Men det bedste ved at anvende C++s cout er altså, at du kan udvide
den. F.eks har jeg selv lavet en lille fiks ting, som jeg bruger,
når jeg vil have pæne udskrifter af containere:
list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
cout << format(l.begin(), l.end(), "(", ", ", ")") << endl;
Som udskriver '(1, 2, 3)'. Og igen kan du kombinere dine egne
kreationer med hvad der ligger i standarden allerede.
-Claus