aboutsummaryrefslogtreecommitdiff
path: root/Занимательное программирование/5/3_context/main.cpp
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-02-27 17:49:09 +0100
committerEugen Wissner <belka@caraus.de>2026-02-27 17:49:09 +0100
commit1768f21de7b75c98c932fcd734218d348b1b0060 (patch)
treee517cc9b792f376b211bbd37a496269913d833d5 /Занимательное программирование/5/3_context/main.cpp
parent82ae29cb8a59a1e093190d14f8c5097658545a12 (diff)
downloadbook-exercises-1768f21de7b75c98c932fcd734218d348b1b0060.tar.gz
Добавлена третья задача пятой главы
Diffstat (limited to 'Занимательное программирование/5/3_context/main.cpp')
-rw-r--r--Занимательное программирование/5/3_context/main.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/Занимательное программирование/5/3_context/main.cpp b/Занимательное программирование/5/3_context/main.cpp
new file mode 100644
index 0000000..d9f40d2
--- /dev/null
+++ b/Занимательное программирование/5/3_context/main.cpp
@@ -0,0 +1,67 @@
+#include <iostream>
+#include <cstdlib>
+#include <array>
+#include "utf8.h"
+#include "context.hpp"
+#include "utf8/checked.h"
+
+static
+context_model process_input()
+{
+ std::array<char, 4096> buffer;
+ std::ptrdiff_t left_over{ 0 };
+ context_model context;
+
+ while (!std::cin.eof())
+ {
+ std::cin.read(buffer.data() + left_over, buffer.size() - left_over);
+
+ std::array<char, 4096>::iterator octet_iterator = std::begin(buffer);
+ std::array<char, 4096>::iterator start_iterator = octet_iterator;
+ std::array<char, 4096>::iterator end_iterator = octet_iterator + std::cin.gcount() + left_over;
+
+ try
+ {
+ while (start_iterator != end_iterator)
+ {
+ utf8::utfchar32_t character = utf8::next(start_iterator, end_iterator);
+
+ context.add(character);
+ octet_iterator = start_iterator;
+ }
+ left_over = 0;
+ }
+ catch (const utf8::not_enough_room&)
+ {
+ std::copy(octet_iterator, end_iterator, std::begin(buffer));
+ left_over = std::distance(octet_iterator, end_iterator);
+ }
+ }
+ return context;
+}
+
+/*
+ * Reads a UTF-8 file from stdin, analyzes it and prints context information.
+ */
+int main(int argc, char **argv)
+{
+ context_model context = process_input();
+
+ std::size_t i{ 0 };
+ for (auto [context_characters, occurrence]: context)
+ {
+ ++i;
+ std::cout << i << ". " << context_characters << ": ";
+
+ for (auto [character, count]: occurrence)
+ {
+ std::string character_bytes;
+ utf8::append(character, character_bytes);
+
+ std::cout << character_bytes << " - " << count << "; ";
+ }
+ std::cout << std::endl;
+ }
+
+ return EXIT_SUCCESS;
+}