[C++] stringstream och width(), snygga till kod?

Permalänk
Hedersmedlem

[C++] stringstream och width(), snygga till kod?

int iPos, iHours, iMinutes, iSeconds; std::stringstream ssTime; iHours = iPos/3600; iMinutes = (iPos%3600)/60; iSeconds = iPos%60; ssTime.width(2); ssTime.fill('0'); ssTime << iHours << ":"; ssTime.width(2); ssTime.fill('0'); ssTime << iMinutes << ":"; ssTime.width(2); ssTime.fill('0'); ssTime << iSeconds;

Det måste väl gå att snygga till den här koden? Ser ju hemskt ut...

Koden ska alltså köra om tre ints till en sträng (utan sprintf()), som fyllt ut med en nolla före siffran om talet inte är tvåsiffrigt.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem

Det är väl inget fel på den koden (om den nu gör vad den skall). Den är klar och tydlig och det framgår hur det hela fungerar.

Visa signatur

perga

Permalänk
Medlem

Re: [C++] stringstream och width(), snygga till kod?

Citat:

Ursprungligen inskrivet av Thomas

int iPos, iHours, iMinutes, iSeconds; std::stringstream ssTime; iHours = iPos/3600; iMinutes = (iPos%3600)/60; iSeconds = iPos%60; ssTime.width(2); ssTime.fill('0'); ssTime << iHours << ":"; ssTime.width(2); ssTime.fill('0'); ssTime << iMinutes << ":"; ssTime.width(2); ssTime.fill('0'); ssTime << iSeconds;

Det måste väl gå att snygga till den här koden? Ser ju hemskt ut...

Koden ska alltså köra om tre ints till en sträng (utan sprintf()), som fyllt ut med en nolla före siffran om talet inte är tvåsiffrigt.

Om det nu blev någon förbättring...

int iPos, iTid[3]; std::stringstream ssTime; iTid[0] = iPos/3600; iTid[1] = (iPos%3600)/60; iTid[2] = iPos%60; for (int i=0; i<3; i++) { ssTime.width(2); ssTime.fill('0'); ssTime << iTid[i]; }

Föresten, räcker det inte med att köra width() och fill() en gång? Eller rent av köra allt i en följd

ssTime << iHours << ":" << iMinutes << ":" << iSeconds;

?

Permalänk
Hedersmedlem

Nope, testade det först såklart.
Gör man så så blir endast ett argument fixat, sedan nollställer den tydligen (antagligen anledningen till att ":" inte blir "0:").

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS