Svmmarivm
Haec lectio septimam cvrsvs partem, textvi et plicis dedicatam, conclvdit. Programma introdvctionis, qvod data sine monitione amittebat et nomina cvm accentibvs perperam metiebatvr, iis qvae didicimvs rescribit; catenam notionvm restitvit qvae a catena charactervm ad formam plicae dvcit; qvae ex his in qvalibet lingva valent ab iis qvae C++ propria svnt separat; modvm agendi indefinitvm partis colligit, cvm eo qvod detector sistit et eo qvod nemo videt; in probatione finali facvltates probationis initialis repetit; et sex provocationibvs finitvr qvae totam partem conivngvnt.
Proposita discendi
- Textvm vervm cvm sva codificatione tractare: magnitvdinem catenae in octetis praedicere, litteras eivs nvmerare et operationes vitare qvae
UTF-8frangvnt. - Introitvs et plicas firmiter legere, datvm invalidvm a fine datorvm distingvendo et qvodqve datvm vt textvm integrvm validando.
- Plicas eventvvm forma praescripta prodvcere, qvemqve versvm invalidvm cvm nvmero svo nvntiando.
- Modvm agendi indefinitvm partis agnoscere (conspectvm pendentem, indicem extra catenam) eviqve a defectibvs definitis distingvere qvi item silentio transevnt.
- In iis qvae in parte didicimvs separare qvae in qvalibet lingva valent ab iis qvae C++ propria svnt.
Qvae vnitas consecvta est
Pars sibi proposverat docere qvomodo textvs vt datvm tractetvr et qvomodo programma plicas legat et scribat neqve introitv male formato frangatvr. Propositvm impletvm est iis solis innixvm qvae introdvctio pro cognitis habenda declaravit: charactere vt codice partis 2, bitis partis 3, vectoribvs et tabvlariis partis 6 et fvnctionibvs cvm pacto partis 5. Programma indicis aestimationvm, qvod per >> legebat, Anam Pérez et Lvis amittebat et «Íñigo» longivs qvam «Carmen» declarabat, nvnc sic scribitvr: versvs plicae legit, aestimationem ad vltimvm spativm separat, eam per fvnctionem parseInt lectionis Bene legere validat, versvm invalidvm per flvxvm errorvm nvntiat, nomina in characteribvs metitvr et indicem in alia plica relinqvit. Vt exemplvm per se stet, programma primvm plicam datorvm scribit, qvae in vsv iam exstaret.
#include <charconv>#include <cstddef>#include <fstream>#include <iostream>#include <print>#include <string>#include <string_view>// Ivdicat vtrvm textvs exacte integer sit.// Praecondicio: nvlla.// Postcondicio: illa lectionis «Bene legere».bool parseInt(std::string_view text, int& value){ int result{}; const auto last{text.data() + text.size()}; const auto [stop, error]{std::from_chars(text.data(), last, result)}; if (error != std::errc{} || stop != last) { return false; } value = result; return true;}// Nvmervs charactervm textvs UTF-8.// Praecondicio: text est UTF-8 validvm.// Postcondicio: reddit nvmervm charactervm (non octetorvm) text.std::size_t letterCount(std::string_view text){ std::size_t count{0}; for (const char c : text) { if ((c & 0xC0) != 0x80) { ++count; } } return count;}int main(){ { std::ofstream out{"grades.txt"}; std::println(out, "Carmen 65\nÍñigo 70\nAna Pérez 58\nLuis sex\nTomás 61"); } std::ifstream in{"grades.txt"}; std::ofstream report{"report.txt"}; if (!in || !report) { std::println(std::cerr, "Plicae aperiri non potvervnt"); return 1; } std::string line{}; std::string longest{}; int lineNumber{0}; while (std::getline(in, line)) { ++lineNumber; const std::size_t space{line.rfind(' ')}; int grade{}; if (space == std::string::npos || !parseInt(std::string_view{line}.substr(space + 1), grade)) { std::println(std::cerr, "Versvs {} invalidvs: «{}»", lineNumber, line); continue; } const std::string name{line.substr(0, space)}; std::println(report, "{:<10}{:>3}", name, grade); if (letterCount(name) > letterCount(longest)) { longest = name; } } std::println("Nomen longissimvm: {} ({} characteres)", longest, letterCount(longest));}Versvs 4 invalidvs: «Luis sex»Nomen longissimvm: Ana Pérez (9 characteres)Visorivm solvm nvntivm erroris et conclvsionem ostendit; index in plica est, qvam mandatvm cat (in PowerShell, Get-Content) post programma exsecvtvm ostendit:
$ cat report.txtCarmen 65Íñigo 70Ana Pérez 58Tomás 61Qvodqve membrvm vitio introdvctionis respondet. Lectvra per versvs et rfind nomina cvm spatiis permittvnt; npos et parseInt versvm Lvis reicivnt, evm cvm nvmero svo nvntiant et Tomás pergere sinvnt; letterCount characteres nvmerat, et «Ana Pérez», cvm novem characteribvs et decem octetis, ivre vincit; et report.txt completa est cvm main finitvr, cvm flvxvs eivs clavditvr.
Catenae charactervm
Lectio Catenae charactervm std::string vt seqventiam char cvm operationibvs textvs praebvit. Docvit qvaerere per find, qvae positionem vel npos reddit, hvnc valorem semper explicite comparare, et per substr extrahere, qvae positionem validam postvlat; std::string_view praebvit, tvtvm vt parametrvm et pericvlosvm si textvi qvem observat svperest, et catenas C, ad contrarivm ostendendvm.
Textvs non est ASCII
Lectio Textvs non est ASCII characterem, pvnctvm codicis eivs et octetos eivs separavit, et explicavit qvomodo UTF-8 bitos inter vnvm et qvattvor octetos distribvat. Inde dedvxit size octetos nvmerare, characteres per (c & 0xC0) != 0x80 nvmerari, invertere, in maivscvlas mvtare vel octeto post octetvm secare textvm frangere, qvaerere et concatenare evm non frangere, et qvid bibliotheca normata non faciat.
Bene legere
Lectio Bene legere introitvm vt confinivm non fidvm tractavit. Docvit versvs per std::getline legere, per fail() et eof() distingvere datvm invalidvm, nvmervm qvi non capitvr et finem datorvm, se recipere per clear et ignore, et nvmervm vt textvm per std::from_chars validare, postvlando vt totvs consvmatvr; conclvsit cvm parseInt et readInt, fvnctionibvs confinii cvm pacto.
Plicae textvs
Lectio Plicae textvs ostendit plicam esse flvxvm, cvm statv std::cin. Inspectionem apertionis regvlam fecit; demonstravit cvr while (!in.eof()) vnvm datvm plvs tractet; docvit scribere per std::println(out, …), svbstitvendo vel addendo, et nvntia ab eventis per std::cerr separare; et omnia ad formam versvs praescriptam et validatam perdvxit.
Argvmentvm oneratvr…