- Вывод ASCII символов
- Решение
- Решение
- Как вывести код символа?
- Строки и потоки ввода-вывода C++
- Кувшинов Д.Р.
- Кодировки
- ASCII
- Управляющие символы
- Печатные символы
- Восьмибитные кодировки
- Юникод
- Типы символов в C++
- Литералы
- Символьные литералы
- Строковые литералы
- Стандартный заголовочный файл cstring
- Блоки памяти
- Си-строки
- Стандартный заголовочный файл string
- Простейшие операции с объектами string
- Создание строк
- Вставка, удаление и замена подстрок
- Поиск в строке
- Элементы библиотеки Iostreams
- Базовые элементы
- Использование fstream
- Использование sstream
- iostream-типы
Вывод ASCII символов
Хочу к примеру вывести на экран символ 219 (закрашенный черный квадрат) и 176 (закрашенный белый квадрат).
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Вывод символов ASCII
Что нужно написать чтобы выводился символ ASCII?
Вывод символов ASCII в терминал
Добрый вечер господа возник вопрос связанный с выводом на экран зашифрованного текста. Когда.
Перевод символов в ASCII
#include #include using namespace std; int main () < int a, b; cin.
Коды символов ASCII
Почему русские строковые литералы char first = ‘А’; char last = ‘Я’; cout 9
Решение
В общем у меня в начале была строка
setlocale (LC_ALL, «rus»);
поэтому выводилось на экран не понятно что) если ее убрать то все работает как я написал выше)
только я не до конца конечна понимаю почему)))
Решение
Двоичное представление символов ASCII
например дана последовательность: 0110100001101001 где h=01101000 i=01101001 ].
Коды таблицы символов ASCII
Почему когда я делаю явное преобразование вводимого с клавиатуры символа в int,компилятор выдаёт.
ASCII игра из русских символов
В общем решил написать небольшую консольную игру, все игровые объекты будут отображаться символами.
Вывести таблицу символов кодов ASCII
Вывести таблицу символов кодов ASCII таким образом, чтобы ряды обозначали кол-во десятков, а.
Кодировать текст в ASCII набор символов
Нужно написать программу которая обрабатывает строки символов Программа должна считывать целое.
Отображение ASCII символов в двоичном коде
Добрый день. Есть программа, которая отображает двоичный код ASCII символа. #include .
Источник
Как вывести код символа?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Вывести код символа
Помогите с помощью scanf и printf, библиотекой stdio.h написать программу: с клавиатуры вводится.
Вывести ascii код символа
На самом деле я немного в ступоре, но почему код выводит число 99, а не 11? #include .
Вывести код введенного пользователем символа
Напишите программу, которая выводит код введенного пользователем символа. Программа должна.
Вывести на экран код и тип символа
С клавиатуры вводится произвольная последовательность символов. Для каждого символа выведите на.
mirso
спасиб, теперь разобрался
Добавлено через 8 минут
Странно. Почему когда я пишу (char)(i), пишется непонятный символ,
а когда (char)(65), ну и любого другого числа то выводится все по кодировке?
Вывести ASCII–код символа в десятичном, восьмеричном и шестнадцатеричном виде
Здравствуйте. Помогите пожалуйста с лабораторной. В языке С++ полный ноль, ничего не понимаю.
Как определить код символа ?
Ввести любой латинский строчный символ с клавиатуры. Вывести его порядковый и соответствующий.
Как получить бинарный код символа?
Я читаю txt в котором разные символы(без русских) типа такого 45h8giJDFJH Я должен прочитать их.
Как определить двоичный код символа.
Как определить двоичный код символа? Нашёл тему и исходный код программы, но мне нужно понять.
Источник
Строки и потоки ввода-вывода C++
Кувшинов Д.Р.
Кодировки
Кодировка символов — способ записи последовательности символов (строки) с помощью последовательности натуральных чисел (“кодов”). В простейшем случае кодировка задаётся таблицей символов, в которой перечислены все доступные символы, и каждому из них присвоен код (номер). Как правило, в более сложных случаях такая таблица всё равно есть, но кодировка включает в себя особенности оформления кодов с целью уменьшения размера сообщения в байтах.
ASCII
ASCII (от American Standard Code for Information Interchange — “американский стандартный код для обмена информацией”) — кодировка символов, получившая широкое распространение.
Кодировка ASCII содержит 128 символов, каждому из которых соответствует своя последовательность семи бит (двоичная запись номера символа).
Управляющие символы
Первые 32 кода и последний (символ 127) выделены для специальных управляющих символов. Большинство этих кодов были важны во времена использования телетайпов и других подобных устройств, напрямую управлявшихся последовательностью переданных на них символов, и в настоящее время практически не используются. Символ 127 ( DEL ) использовался для уничтожения содержимого перфоленты при записи поверх старого содержимого (код 127 соответствует семи пробитым отверстиям).
Номер | Номер16 | Символ | Запись в C | Смысл |
---|---|---|---|---|
0 | 00 | null character NUL | \0 | нулевой символ — конец си-строки |
7 | 07 | bell BEL | \a | звуковой сигнал |
8 | 08 | backspace BS | \b | сдвинуть каретку влево на одну позицию |
9 | 09 | horizontal tabulation TAB | \t | сдвинуть каретку вправо до следующей колонки |
10 | 0A | line feed LF | \n | сдвинуть каретку вниз на одну строку (новая строка) |
11 | 0B | vertical tabulation VT | \v | сдвинуть каретку вниз до следующей группы строк |
12 | 0C | form feed FF | \f | подать новый лист |
13 | 0D | carriage return CR | \r | вернуть каретку на начало строки |
27 | 1B | escape ESC | \x1b | переключиться в режим приёма управляющей последовательности |
127 | 7F | delete DEL | \x7f | удалить следующий символ |
- Колонка “Запись в C” содержит обозначение символа, используемое в строковых и символьных литералах.
- При выводе символа LF в текстовый поток вывода по стандартам C и C++ выводится последовательность, соответствующая новой строке (один символ LF в современных Unix-подобных системах или пара символов CR LF в Windows).
- Символы VT , FF , ESC и DEL при выводе в консоль обычно или игнорируются или выводятся некоторым графическим символом.
- Коды BS , TAB , ESC и DEL соответствуют одноимённым клавишам на стандартной “IBM PC”-клавиатуре и могут использоваться как коды, передаваемые при нажатиях этих клавиш.
- При выводе символа BS в консоль обычно происходит перемещение курсора назад, что позволяет следующим выведенным символом затереть предыдущий. При реальной печати на бумаге смещение каретки назад могло использоваться для имитации полужирного шрифта (пропечатать один текст дважды), совмещения символов (можно получить символы вроде Ø, â, Ƚ, ǹ и т.п. — для этого такие символы как ^ ,
располагались в шрифтах выше букв), подчёркивания (пропечатать символ _ поверх подчёркиваемого текста).
Печатные символы
Полную таблицу см. здесь.
Номера | Номера16 | Символы | Запись в C |
---|---|---|---|
32 | 20 | пробел | пробел |
34 | 22 | двойные кавычки « | \» |
39 | 27 | кавычка ‘ | \’ |
48–57 | 30–39 | цифры 0–9 | 0 – 9 |
65–90 | 41–5A | заглавные латинские буквы A–Z | A – Z |
92 | 5C | обратная косая черта \ | \\ |
95 | 5F | знак подчёркивания | _ |
97–122 | 61–7A | строчные латинские буквы a–z | a – z |
- Диапазоны цифр 0–9 и букв A–Z и a–z непрерывны, поэтому при проверке на то, является ли символ ASCII цифрой или буквой можно использовать сравнение снизу и сверху (проверку попадания в диапазон кодов).
- Строчные и заглавные буквы отличаются установленным (строчные) или сброшенным (заглавные) пятым битом (с весом 32).
Восьмибитные кодировки
Один восьмибитный байт может принимать 256 различных значений. При передаче символов ASCII один символ кодируется одним байтом, при этом старший бит устанавливается в ноль, а семь младших бит содержат код символа. Таким образом, задействуется лишь половина доступного диапазона. Это открывает возможность расположить в следующих 128 кодах какие-то другие символы. В итоге появилось множество различных ASCII-совместимых кодировок, различающихся “верхними” (с установленным старшим битом) 128-ю символами, например, “европейская” Latin-1 и кириллические КОИ-8, IBM CP866, Windows-1251. Выбор кодировки заключается в смене различающихся 128 символов, которые называют “кодовой страницей” codepage . Интерпретатор командной строки cmd.exe в Windows позволяет переключать текущую страницу командой chcp , по умолчанию для кириллицы в консоли используется страница 866 (совместимость с MS-DOS).
К сожалению, такие восьмибитные кодировки не могли решить проблему как кодирования письменностей, в которых большое количество знаков (например, китайская) или записи текстов, включающих символы из разных письменностей.
Юникод
Юникод Unicode — группа стандартов, посвящённых кодированию и передаче текстов на электронных носителях в символьной форме. Фактически состоит из двух частей: стандартизованного набора знаков (Universal Character Set, UCS) и кодировок (Unicode Transformation Format, UTF). UCS основан на символьном подходе в противовес графическому подходу, т.е. даже если символы из разных письменностей выглядят одинаково, они считаются разными (например, латинское C и кириллическое С). UCS разбит на пронумерованные “плоскости” planes , собирающие символы в группы, но нумерация самих символов сплошная. Первые 128 символов совпадают с кодировкой ASCII. Ряд “символов” UCS представляет собой не отдельные символы, а части символов, графически комбинируемые с соседними символами. Кроме того, есть и управляющие символы, в том числе, доставшиеся в наследство от ASCII. Поэтому элементы UCS принято называть кодовыми позициями codepoints . Зарезервированный объём UCS составляет немногим больше одного миллиона символов, используемый — всего порядка 110 тысяч. Недостатком Юникода является то, что одно и то же изображение часто может быть получено различными способами (помимо визуально совпадающих знаков различных письменностей, это могут быть символы-комбинации знаков, например, буквы й и ё).
Кодировка UTF-32 (UTF-32BE для BE-порядка байт, UTF-32LE для LE-порядка байт) передаёт каждую кодовую позицию 4-байтным целым (номером в UCS, поэтому UTF-32 также обозначают как UCS-4). Эта кодировка сравнительно удобна для работы с Юникод-текстами в памяти, но считается недостаточно компактной для задач хранения и передачи текстов. К сожалению, даже в случае UTF-32 одному знакоместу (графическому изображению символа) на экране может соответствовать больше одного 4-байтного кода, его формирующих.
Кодировка UTF-8 передаёт каждую кодовую позицию последовательностью байт (от 1 до 4). При этом, текст в кодировке ASCII является текстом в кодировке UTF-8 (обратная совместимость), а для представления дополнительных символов используются байты с установленным старшим битом. Данная кодировка на данный момент является самым распространённым способом передачи текстов по сети Интернет. Её преимуществами, в частности, являются компактность представления символов ASCII и независимость от порядка байт (нет проблемы big endian vs little endian).
Тема работы с Юникодом (и строковыми данными вообще) очень обширна и содержит множество тонкостей, здесь рассматриваются лишь некоторые простые элементы в аспекте программирования на C и C++. Для серьёзного изучения как Юникода, так и затронутых здесь разделов стандартной библиотеки C++ следует обратиться к специализированным источникам.
Типы символов в C++
В языке C первоначально был только один встроенный тип, предназначенный для представления символов — тип char , “по совместительству” являющийся представлением байта, как минимальной отдельно адресуемой единицей памяти. Символьные кодировки не входят в стандарты C и C++ и являются прерогативой системы.
В начале развития стандарта Юникод в C++ был введён новый тип символа — wchar_t (т.е. “широкий символ” wide character ), по определению являющийся целочисленным типом с диапазоном, достаточным для представления всех символов, доступных на данной системе. Так как поначалу предполагалось, что Юникоду “хватит” 16 бит для представления всех номеров UCS, в некоторых системах (например, Windows) был закреплён 16-битный wchar_t. В современных GNU/Linux-системах используется 32-битный wchar_t, подходящий для кодировки UTF-32.
В связи с введением в обиход различных кодировок UTF и отсутствием совместимости между различными системами при использовании wchar_t в C++11 были добавлены два новых символьных (целочисленных) типа: char16_t для 16-битных кодировок (UCS-2, UTF-16) и char32_t для 32-битных кодировок (UTF-32). Возможно введение в будущем стандарте типа char8_t , пока же для представления единиц кодирования строк в кодировке UTF-8 используется тип char.
Литералы
Символьные литералы
Символьный литерал — представление константы символьного типа непосредственно в тексте программы. Символьные литералы записываются в одинарных кавычках и должны содержать один символ, который задаётся либо непосредственно, либо с помощью специальной экранированной последовательности escape sequence , открываемой символом \ .
Стандартные экранированные последовательности для некоторых управляющих символов, а также специальных символов (обратная косая черта, кавычки) приведены в таблицах выше в колонках под заголовком “Запись в C”.
Экранированные последовательности позволяют указать код символа числом: в шестнадцатеричной системе после префикса x или в восьмиричной системе (без префикса), например, ‘\x5c’ — то же, что ‘\134’ — то же, что ‘\\’ , а именно сам символ “обратная косая черта”.
При записи непосредственно символа в литерал, компилятор может оставить код в той кодировке, в которой символ был введён, либо преобразовать в некоторую кодировку “по умолчанию”. Например, исходный код может быть набран в кодировке UTF-8, в которой кириллические знаки записываются двухбайтными кодами, но компилятор Visual C++ при оформлении символьного литерала типа char (один байт) преобразует их к кодировке Windows-1251.
Выбор конкретного типа символа осуществляется с помощью префикса.
Тип | Префикс | Пример | Стандарт | Диапазон |
---|---|---|---|---|
char | нет | ‘a’ | C90 | системная кодировка |
wchar_t | L | L’ф’ | C++98 | системная кодировка |
char16_t | u | u’ф’ | С++11 | UCS-2 |
char32_t | U | U’∀’ | C++11 | UCS-4 |
char8_t | u8 | u8’z’ | C++17 (план) | ASCII |
Строковые литералы
Строковый литерал — представление константной последовательности символов непосредственно в тексте программы. Строковые литералы записываются в двойных кавычках и могут не содержать ни одного символа. Максимальное допустимое количество символов с строковом литерале определяется компилятором.
Каждому строковому литералу соответствует константный массив соответствующего символьного типа, содержащий символы литерала в соответствующей символьному литералу кодировке плюс завершающий нулевой символ. Поэтому реальный размер такого массива, по крайней мере, на единицу больше числа символов в нём.
Строковый литерал может содержать такие же экранированные последовательности, как символьный литерал. Каждой экранированной последовательности соответствует один символ.
Расположенные подряд строковые литералы, разделённые лишь пробельными символами и комментариями, автоматически конкатенируются в один строковый литерал. Например:
Префикс | Пример | Кодировка | Тип символа | Стандарт |
---|---|---|---|---|
нет | «two words» | системная | char | C90 |
L | L»два слова» | системная | wchar_t | C++98 |
R | R»!(C:\User\)!» | см. ниже | см. ниже | C++11 |
u | u»∀ε>0 ∃δ « | UTF-16 | char16_t | C++11 |
U | U»A∨¬A» | UTF-32 | char32_t | C++11 |
u8 | u8″escape-знак» | UTF-8 | char8_t | C++11 |
Префикс R (от англ. raw — “сырой”) позволяет ввести строку без экранирования символов: все символы между R“ разделитель ( и ) разделитель ” включаются в литерал. Здесь разделитель — произвольная последовательность символов, которая выбирается так, чтобы она (с закрывающей скобкой) не встречалась в самой строке. Перед префиксом R можно поставить префикс, определяющий тип символа и кодировку.
Стандартный заголовочный файл cstring
Си-строка или нуль-терминированная строка — структура данных, представляющая собой массив символов, последний из которых (и только он) является нулевым. Так как нулевой символ маркирует конец си-строки, для передачи её в функцию достаточно передать указатель на её начало. Любой указатель на символ некоторой си-строки является указателем на её подстроку — тоже си-строку.
Заголовочный файл cstring содержит базовый функционал для работы с си-строками и массивами символов (байт). Массивы байт передаются парой (указатель (типа void* ), размер (в байтах)). Далее приведены краткие описания некоторых стандартных функций, объявленных в этом заголовочном файле.
Для краткости даны объявления функций только для языка C. В случае C++ нередко существуют аналогичные пары функций с различной константностью (C “теряет” константность), например, в C:
- void* memchr (const void* mem, int byte, size_t count) — теряет свойство “только для чтения” блока mem .
В то же время в C++ (в пространстве имён std) имеется сразу два варианта:
- void* memchr (void* mem, int byte, size_t count) — блок, допускающий запись;
- const void* memchr (const void* mem, int byte, size_t count) — блок только для чтения.
Блоки памяти
- void* memset (void* dest, int byte, size_t count) заполняет блок памяти с адресом dest длиной count байт значением byte (приведённым к unsigned char ). Возвращает dest .
- void* memcpy (void* dest, const void* src, size_t count) копирует содержимое блока памяти с адресом src длиной count байт по адресу dest . Возвращает dest . В случае, если диапазоны [ src , src + count ) и [ dest , dest + count ) имеют непустое пересечение, поведение не определено.
- void* memmove (void* dest, const void* src, size_t count) действует аналогично memcpy , но также обрабатывает случай пересекающихся диапазонов. Семантика в этом случае эквивалентна копированию через временный промежуточный буфер. Наличие двух разных функций memcpy и memmove связано с тем фактом, что memcpy может быть быстрее благодаря предположению, что диапазоны не пересекаются.
- void* memchr (const void* mem, int byte, size_t count) ищет в блоке памяти с адресом mem длиной count байт первое с начала блока вхождение байта byte (приводится к unsigned char ). Если такой байт найден, то функция возвращает его адрес. В противном случае возвращает нулевой указатель.
- int memcmp (const void* lhs, const void* rhs, size_t count) сравнивает побайтно лексикографически (“словарно”) два блока памяти (с адресами lhs и rhs ) одинаковой длины count байт. Возвращает –1, если блок lhs стоял бы в словаре до rhs ; 0, если блоки равны; и +1, если бы блок lhs стоял бы в словаре после rhs . При сравнении порядок байт относительно друг друга определяется их числовыми значениями, а не смыслом соответствующих им символов.
Си-строки
Все эти функции порождают неопределённое поведение, если в качестве параметра, подразумевающего передачу адреса си-строки с завершающим нулём, передаётся указатель, не указывающий на си-строку.
- size_t strlen (const char* str) возвращает длину си-строки с адресом str , т.е. по сути расстояние от str до первого вхождения нулевого символа, измеренное в байтах.
- char* strcpy (char* dest, const char* src) копирует строку с адресом src (вместе с завершающим нулём) в буфер по адресу dest , возвращает dest . Поведение не определено, если выделенный буфер недостаточно большой (выделен слишком маленький блок памяти, либо диапазон области копирования пересекается с исходной строкой).
- char* strcat (char* dest, const char* src) дописывает копию си-строки по адресу src к си-строке по адресу dest . Т.е. выполняет конкатенацию строк. Блок памяти, в котором хранится строка по адресу dest должен иметь достаточный размер, чтобы вместить конкатенацию. Возвращает dest .
- char* strchr (const char* str, int byte) ищет в си-строке по адресу str первое вхождение байта со значением byte . Возвращает указатель на найденный байт, либо нулевой указатель, если найти заданный байт не удалось.
- char* strrchr (const char* str, int byte) ищет в си-строке по адресу str последнее вхождение байта со значением byte . Возвращает указатель на найденный байт, либо нулевой указатель, если найти заданный байт не удалось.
- int strcmp (const char* lhs, const char* rhs) сравнивает две си-строки лексикографически, возвращает –1, если строка lhs стояла бы в словаре до rhs ; 0, если строки равны; +1, если бы lhs стояла бы в словаре после rhs . При сравнении порядок байт относительно друг друга определяется их числовыми значениями, а не смыслом соответствующих им символов.
- char* strstr (const char* str, const char* substr) ищет в си-строке по адресу str первое вхождение подстроки, заданной си-строкой с адресом substr . Возвращает указатель на первый символ найденной подстроки, либо нулевой указатель, если такой подстроки нет.
Также существуют аналоги данных функций для работы с wchar_t и многобайтными кодировками.
Стандартный заголовочный файл string
Возможности C++ позволяют определить тип данных, объекты которого самостоятельно управляют массивом символов (строкой) и предоставляют набор удобных в использовании базовых операций.
Тип строки | Тип элемента | Стандарт |
---|---|---|
string | char | C++98 |
wstring | wchar_t | C++98 |
u16string | char16_t | C++11 |
u32string | char32_t | C++11 |
Все перечисленные строковые типы по существу устроены одинаково и предоставляют одинаковые с точностью до типа данных наборы операций. Фактически они являются объектами, управляющими динамическими массивами символов, в которых и хранятся строки. В отличие от си-строк, данные объекты позволяют хранить произвольные символы, включая нулевые. Строки можно сравнивать с помощью обычных операций сравнения вроде == и (используется лексикографический порядок).
Простейшие операции с объектами string
Далее приведены примеры использования некоторых возможностей стандартных строк.
В заголовочном файле string также определены удобные функции преобразования между числами и их строковыми представлениями:
- stoi, stol, stoll, stoul, stoull (const ( w ) string &s, size_t *pos = nullptr, int radix = 10) распознают содержимое строки s как целое число (типов int, long, long long, unsigned long и unsigned long long соответственно — два последних варианта не принимают знак числа), читая её с начала до момента первой ошибки (или конца числа). По адресу pos (если это не нулевой указатель) сохраняется индекс первого символа за считанным числом. Значение radix задаёт основание системы счисления (принимаются основания от 2 до 36). Если в качестве значения radix передать 0, то основание будет распознаваться по префиксу аналогично целочисленным литералам (0 — основание 8, 0x/0X — 16, другое — 10; двоичные 0b/0B пока не вошли в стандарт по этим функциям, так как они определены через стандартные функции C strtol, strtoll, strtoul и strtoull, а в стандарт C двоичные литералы пока не входят).
- stof, stod, stold (const ( w ) string &s, size_t *pos = nullptr) распознают содержимое строки s как число с плавающей точкой (типов float, double и long double соответственно), читая её с начала до момента первой ошибки (или конца числа). По адресу pos (если это не нулевой указатель) сохраняется индекс первого символа за считанным числом. Числа распознаются в соответствии с правилами записи литералов, кроме того, принимаются строки INF или INFINITY (без учёта регистра) как значение “бесконечность” и NAN как значение “нечисло”.
- to_string, to_wstring ( что-то ) возвращает строковое представление (в виде объекта string и wstring соответственно) значений встроенных типов.
Создание строк
Класс string предоставляет набор конструкторов, некоторые из которых могут пригодиться, например, при выполнении заданий из самостоятельной 11.
Примеры даны в двух вариантах: определение переменной типа string и создание временного объекта типа string.
Вставка, удаление и замена подстрок
Вставка подстрок может осуществляться с помощью функций append (в конец) и insert (на произвольную позицию).
Удаление подстроки может быть выполнено функцией erase .
Замена подстрок (с заданным положением, а не содержанием) выполняется с помощью функции replace .
Поиск в строке
Объекты string поддерживают несколько функций поиска (подстрок и символов). Все эти функции возвращают индекс первого символа, отвечающего найденному вхождению, либо специальное значение string::npos , если ничего не было найдено.
Элементы библиотеки Iostreams
Базовые элементы
Вывод текстового представления значения value в stdout выполняется с помощью оператора
Записать в поток один символ можно или оператором >> , то поток будет пропускать все пробельные символы. Проверьте, например, как работает следующий код:
Считать “слово”, т.е. пропустить все пробельные символы и считать последовательность непробельных символов до первого пробельного или конца файла (сочетание +-. тоже будет считаться “словом”) можно с помощью std::cin >> word , где word имеет тип string .
Считать всё до перевода строки можно с помощью std::getline(std::cin, line) , где line — тоже строковая переменная. Чтобы читать из потока до заданного символа ch , можно указать третий параметр: std::getline(std::cin, line, ch) . Функция getline забирает символ-разделитель (перевод строки или значение ch ) из потока ввода, но не дописывает его к считанной строке.
Далее идёт листинг, демонстрирующий некоторые возможности средств текстового ввода-вывода стандартной библиотеки C++. Возможно, не всё из этого будет понятно на данном этапе, однако, оно может пригодиться в дальнейшем.
“Задержка экрана” в простых случаях может быть выполнена с помощью чтения символа с cin (функции get и ignore ). Если буфер ввода пуст, то исполнение программы остановится до тех пор, пока пользователь не введёт что-нибудь.
К сожалению, такой нехитрый приём не работает в ряде случаев, когда поток ввода содержит неопределённое количество “мусора”. Более универсальный метод представлен в примере по ссылке.
Использование fstream
В целом, можно считать, что объекты ifstream ведут себя как cin, а объекты ofstream ведут себя как cout.
Файл позволяет произвольно изменять позицию чтения (для ifstream) и позицию записи (для ofstream).
Для позиции чтения существуют аналогичные функции tellg и seekg . Функции seekg и seekp кроме варианта с абсолютным смещением имеют вариант со смещением относительно трёх возможных позиций: начала ios::beg , текущей позиции ios::cur и конца ios::end . Это позволяет, например, узнать размер открытого файла:
Допускается открытие одного и того же файла сразу несколькими объектами ifstream. Каждый из них будет читать данные со своей позиции чтения.
Использование sstream
Аналогично, можно считать, что объекты istringstream ведут себя как cin, а объекты ostringstream ведут себя как cout. Функция-член str() позволяет обращаться к содержимому потока как к строке типа string: str() возвращает копию содержимого потока в виде строки, а str(строка) устанавливает новое содержимое потока.
В случае записи “поверх” уже записанных данных потоки вывода (и ostringstream и ofstream) просто затирают символы на позиции записи. Вставка символов или удаление “хвоста” не осуществляются.
Тем не менее, при выводе текста в консоль обычно можно имитировать удаление символов с помощью вывода символа BS . Например “крутящаяся палочка”:
Впрочем, данное действие довольно бессмысленно. Если мы хотим показать, что идёт некий процесс, можно выполнять небольшую часть работы между сменами знака “палочки”. В примере ниже функция do_next_job выполняет некоторый фрагмент задачи и возвращает true, если надо продолжить ожидание, и false, если работа завершена:
iostream-типы
Существует набор стандартных типов, механически сочетающих в себе интерфейсы потока ввода istream и потока вывода ostream. В частности, они предоставляют две независимых позиции: позицию чтения и позицию записи. С их помощью можно работать с файлом (тип fstream ) или строкой (тип stringstream ) как с расширяемым массивом байт, который можно и читать и изменять.
Пример использования stringstream для тестирования функции, читающей данные из потока в примере 0520-euclid_norm_2.cpp:
Источник