Parus16.ru

Парус №16
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

C — Базовый ввод/вывод

C ++ — Базовый ввод/вывод

Стандартные библиотеки C ++ предоставляют расширенный набор возможностей ввода / вывода, которые мы увидим в последующих главах. В этой главе будут рассмотрены основные и наиболее распространенные операции ввода-вывода, необходимые для программирования на C ++.

C ++ I / O происходит в потоках, которые представляют собой последовательности байтов. Если байты поступают с устройства, такого как клавиатура, дисковод или сетевое соединение и т. д. В основную память, это называется операцией ввода, и если байты поступают из основной памяти в устройство, такое как экран дисплея, принтер, дисковод , или сетевое соединение и т. д., это называется операцией вывода .

Файлы заголовков библиотеки ввода-вывода

Для программ на C ++ важны следующие файлы заголовков —

Этот файл определяет объекты cin, cout, cerr и clog , которые соответствуют стандартным входным потокам, стандартным потокам вывода, потоку стандартной буферизации без буферизации и потоку стандартной буферизации, соответственно.

Этот файл объявляет услуги , полезные для выполнения отформатированного ввода / вывода с помощью так называемым параметризованным потоком манипуляторами, такие как setw и setprecision .

Этот файл объявляет службы для обработки файлов, управляемых пользователем. Мы обсудим это подробно в главе «Файл и поток».

Стандартный выходной поток (cout)

Предопределенный объект cout является экземпляром класса ostream . Сообщается, что объект cout «подключен к» стандартным устройствам вывода, который обычно является экраном дисплея. СоиЬ используется в сочетании с оператором вставки потока, который записывается в виде << которые являются два меньше , чем знаки , как показано в следующем примере.

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Компилятор C ++ также определяет тип данных переменной, подлежащей выводу, и выбирает соответствующий оператор вставки потока для отображения значения. Оператор << перегружен для вывода элементов данных встроенных типов integer, float, double, string и значений указателя.

Оператор ввода << может использоваться более одного раза в одном выражении, как показано выше, и endl используется для добавления новой строки в конце строки.

Стандартный входной поток (cin)

Предопределенный объект cin является экземпляром класса istream . Говорят, что объект cin прикреплен к стандартным устройствам ввода, которые обычно являются клавиатурой. CIN используется в сочетании с оператором экстракции потока, который записывается как >> , которые являются два больше , чем знаки , как показано в следующем примере.

Когда вышеуказанный код скомпилирован и выполнен, он предложит вам ввести имя. Вы вводите значение, а затем нажмите Enter, чтобы увидеть следующий результат —

Компилятор C ++ также определяет тип данных введенного значения и выбирает соответствующий оператор извлечения потока для извлечения значения и сохранения его в данных переменных.

Оператор извлечения потока >> может использоваться более одного раза в одном выражении. Чтобы запросить более одного элемента данных, вы можете использовать следующее:

Это будет эквивалентно следующим двум утверждениям:

Стандартный поток ошибок (cerr)

Предопределенный объект cerr является экземпляром класса ostream . Говорят, что объект cerr прикреплен к стандартным устройству ошибок, которое также является экраном дисплея, но объект cerr не забуферирован, и каждая вставка потока в cerr вызывает немедленный вывод его вывода.

Сегг также используется в сочетании с оператором вставки потока , как показано в следующем примере.

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Стандартный поток журнала (засорение)

Предопределенный объект clog является экземпляром класса ostream . Объект clog, как говорят, прикреплен к стандартному устройству ошибок, который также является экраном дисплея, но затвор объекта буферизуется. Это означает, что каждая вставка для блокировки может привести к тому, что ее вывод будет удерживаться в буфере до заполнения буфера или до тех пор, пока буфер не будет сброшен.

Засорить также используется в сочетании с оператором вставки потока , как показано в следующем примере.

Читайте так же:
Включаю ноутбук синий экран что делать

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Вы не сможете увидеть какие-либо различия в cout, cerr и clog с этими небольшими примерами, но при написании и выполнении больших программ разница становится очевидной. Поэтому хорошей практикой является отображение сообщений об ошибках с использованием потока cerr и при отображении других сообщений журнала, которые следует использовать.

Ввод вектора с клавиатуры c

Доброго времени суток! В этом уроке мы поговорим о том, как получать данные от пользователя, это очень важный момент для любой компьютерной программы. В принципе, приложение может получать информацию от пользователя (или внешнего мира) разными способами, например, через графический интерфейс пользователя (через различные поля ввода и т.п.), читать из файла, принимать по сети от удаленного источника, ну или как в нашем случае – получать информацию, введенную пользователем с клавиатуры.

Помните, что получение информации от пользователя крайне важный момент, так как большинство ошибок в программах возникают из-за некорректных входных данных, а точнее, из-за недостаточной их обработки.

И так, к делу! Вспомним пример одного из предыдущих уроков, в котором мы в цикле, запрашивали информацию у пользователя, до тех пор, пока он не введет строку «выход». Вот фрагмент исходного кода:

Получение информации с клавиатуры и сохранения этой информации в переменную заключается в одной лишь строке:

Всё очень просто, после того как пользователь введет строку и нажмет на клавишу «Enter», информация окажется в переменной «userString». Но тут есть один нюанс, операция «Console.ReadLine();» (на самом деле, это вызов метода «ReadLine», класса «Console») возвращает как результат строку. Всё бы ничего, но на практике нам потребуется получать от пользователя не только строки, но и числа, например. Так что, нужно научиться преобразовывать строковые значения в численные. К счастью, в языке C# есть инструмент для преобразования типов. На практике, это выглядит примерно так:

Для преобразования типов в C# можно использовать класс (позже я расскажу, что такое класс, а пока не забивайте себе голову этим) «Convert», у этого класса есть большое количество методов (функций – если хотите), так вот, метод «ToInt32» принимает один аргумент, в круглых скобках сразу после имени метода, в нашем случае, этот аргумент является строкой, которая и будет преобразована в число (если конечно такую строку можно будет преобразовать в число).

Теперь давайте напишем программу, которая запрашивает у пользователя сначала одно целое число, затем второе, а потом, выводит результат сложения этих чисел в консоль.

Создадим новый проект и напишем следующий код, в методе Main:

Обратите внимание на комментарий в самом конце кода! Там рассказывается как перевести число, обратно в строку.

А теперь соберите проект и запустите программу. Затем, введите какое-нибудь целое число (только целое и обязательно число!), например, 25 и нажмите клавишу Enter. Потом введите другое число (хотя, можно и тоже самое), например, 10 и нажмите Enter. В результате вы должны увидеть результат сложения этих чисел! Выглядеть это будет примерно так:

Результат выполнения программы

Результат выполнения программы

На этот раз хватит информации. В следующем уроке мы поговорим как обрабатывать ошибки во время выполнения программы. Например, те, которые могут возникнуть в приведенном выше примере, если пользователь введет не число, а простой текст! Но это уже тема следующего урока…

Ввод вектора с клавиатуры c

5.4.3. Ввод символов и командной строки с клавиатуры

Ввести с клавиатуры символ расширенного кода ASCII в выполняемую в данный момент программу можно одним из следующих способов:

1) путем нажатия соответствующей клавиши пишущей машинки на клавиатуре, находящейся на нижнем или верхнем регистре, либо клавиши на малой цифровой клавиатуре, когда она установлена в режим ввода чисел ( Caps Lock включен), либо служебной клавиши (см. табл. 5.14);

Читайте так же:
Горит синяя лампочка на ноутбуке

2) путем нажатия комбинации Ctrl — кл , соответствующей символу, где кл является клавишей пишущей машинки или определенной служебной клавишей (см. табл. 5.14);

3) путем нажатия клавиши Alt , набора расширенного кода ASCII в десятичной системе счисления на малой цифровой клавиатуре и последующего отпускания клавиши Alt .

Способы ввода символов перечислены в порядке увеличения универсальности и одновременно усложнения работы пользователя. Исключение из этого правила состоит в том, что второй способ нельзя считать универсальнее первого.

Первым способом могут быть введены все символы пишущей машинки и четыре управляющих символа, а именно: ESC , BS , НТ ( TAB ) и CR . Если к DOS подключен соответствующий драйвер клавиатуры, то можно ввести и другие символы из расширенного набора ASCII , в частности, символы кириллицы или псевдографические символы. Клавиатуры и драйверы клавиатур оте­чественных ПЭВМ обеспечивают ввод букв кириллицы без каких-либо усилий со стороны пользователя.

Вторым способом можно ввести любой управляющий символ ASCII , за исключением NUL . Комбинация Ctrl — кл , где кл — одна из клавиш А — Z , [, , ], * л и —, обеспечивает ввод символа, код ASCII которого меньше кода ASCII символа кл на 40Н. Например, код ASCII символа G равен 47Н. Тогда путем нажатия комбинации Ctrl — G будет введен символ с кодом 47Н — 40Н = 07Н, т.е. символ BEL (звонок). Комбинация Ctrl — BS вводит управляющий символ ASCII DEL , a Ctrl — Enter — символ ASCII LF , хотя последний можно задать и как Ctrl — J . Эти комбинации ( Ctrl — BS и Ctrl — Enter ), а также комбинация Ctrl -@ не подчиняются приведенному правилу. Так, Ctrl -® выдает расширенный код клавиши 0;3.

Третий способ обеспечивает ввод любого ASCII -символа, за исключением NUL , путем явного задания его кода в десятичной системе счисления. Чтобы драйвер распознал такой способ ввода символа, код последнего набирается на фоне нажатой клавиши Alt . Например, если требуется ввести символ ║ , то нужно нажать клавишу Alt и, удерживая ее, на малой цифровой клавиатуре набрать число 186 (т.е. ВАН), после чего отпустить клавишу Alt . Вслед за этим на экране дисплея появится требуемый символ, если отображение пользовательского ввода (эхо-отображение) обеспечивается. Такой способ ввода символов мы будем обозначать через Alt —< n >, где n —десятичный код символа

Код введенного одним из перечисленных способов символа заносится в буфер клавиатуры, из которого выполняемая программа, используя средства DOS , в состоянии его прочитать. Поэтому, чтобы ввести символ, нет необходимости завершать это действие нажатием клавиши Enter . Однако часто программы, в том числе DOS , требуют ввода строки символов, т.е. не продолжают свою работу, пока в буфере клавиатуры не появится маркер конца строки — символ CR . В таких случаях ввод символа или последовательности символов должен завершаться нажатием клавиши Enter .

Каждый введенный с клавиатуры символ, как правило, немедленно отображается на экране дисплея в позиции курсора. Однако имеется возможность специфицировать в программе ввод символов без эхо-отображения на экране.

Пользователю и программисту часто приходится иметь дело с задействованными в ПЭВМ управляющими символами ASCII , которые представлены в табл. 5.15, где приведены обозначение каждого символа, его графическое изображение, код, назначение и различные варианты ввода.

Многие программные продукты, в том числе и DOS , реагируют на приведенные управляющие символы по-особому. Поэтому отнюдь не всегда и не все символы можно увидеть в виде изображения на экране после их ввода с клавиатуры. Чаще эти символы наблюдаются при копировании текстового файла на экран дисплея. Сделанные замечания относительно особой роли управляющих символов распространяются и на принтер. Вместе с тем некоторыми управ­ляющими символами обычно можно пользоваться в качестве псевдографических (см. табл. 5.16). Тем не менее при записи таких символов в текстовый файл можно столкнуться с определенными трудностями. Если таковые возникнут, то воспользуйтесь встроенным редактором оболочки Norton Commander или даже шестнадцатеричным редактором утилиты Disk Editor . Следует иметь в виду, что внешние драйверы принтеров, поддерживающие кириллицу, зачастую ликвидируют возможность псевдографического использования некоторых управляющих символов. При воз­никновении таких ситуаций проблему можно решить путем преобразования текстового файла в графический формат (например, PCX ) и последующей его печати на принтере в графическом режиме. В данном случае символы печатаются по точкам и поэтому никакого управляющего воздействия на принтер не оказывают.

Читайте так же:
Вентилятор на ноутбуке работает рывками

Сведения, достаточные для ввода псевдографических символов расширенного кода ASCII , были уже представлены в табл. 5.8. При этом (за исключением стрелок — см. дополнительно табл. 5.16) возможно использование только комбинации Alt —< n >, где п — код символа.

Ввод командной строки в ответ на приглашение DOS осуществляется следующим образом. Пользователь на клавиатуре последовательно набирает символы командной строки. Обычно каждый напечатанный символ отображается на экране дисплея в позиции курсора, а сам курсор после этого смещается на одну позицию вправо. Поэтому на экране можно видеть уже набранную часть командной строки. Целесообразно поглядывать на экран с целью своевременного обна­ружения ошибок. Если выяснилось, что набранную часть командной строки требуется отредак­тировать, то это можно сделать одним из следующих способов:

1) нажать клавишу Esc , в результате чего ввод всей командной строки будет отменен и можно будет начать набор командной строки заново;

2. Операции со строками. Часть 1.

Можно использовать оператор cin. Операция ввода записывается как:

При использовании оператора cin необходимо учитывать следующее:

— Ввод заканчивается после нажатия клавиши Enter;

— Если в строке есть пробел, то символы после пробела не вводятся;

— Если количество введенных символов меньше объявленной длины строки, то остальные поля не заполняются. Поэтому необходимо сделать предварительное обнуление строки;

— Если количество введенных символов больше объявленной длины строки, то вводятся все символы до нажатия клавиши Enter.

В качестве оператора ввода при работе со строками вместо оператора записи в поток cin>> лучше использовать функцию cin.getline(), так как потоковый оператор ввода игнорирует вводимые пробелы, а кроме того, может продолжить ввод элементов за пределами массива, если под строку отводится меньше места, чем вводится символов. Функция cin.getline() принимает два параметра: первый аргумент указывает на строку, в которую осуществляется ввод, а второй — число символов, подлежащих вводу.

Рассмотрим пример объявления символьных строк и использования функции ввода cin.getline ().

char myString[4];

cout << RUS(«Введите строку из 3 символов») << ‘\n’;

cout << RUS(«Вы ввели: «) << myString ;

Объявленная в начале программы строка myString может принять только три значащих символа и будет завершена нуль-терминатором. Все последующие символы, вводимые в этот строковый массив, будут отброшены. Как видно из примера, при использовании функции cin.getline () вторым параметром следует указывать число, меньше или равное размеру вводимой символьной строки.

Иногда более удобен ввод с помощью функции gets().

При использовании функции gets() необходимо учитывать следующее:

— Если количество введенных символов меньше объявленной длины строки, то остальные поля не заполняются. Поэтому желательно сделать предварительное обнуление строки;

— Количество введенных символов не должно быть больше объявленной длины строки (функция gets не контролирует количество символов, и это может привести к непредсказуемой ошибке);

— Ввод заканчивается после нажатия клавиши Enter.

char myString[4];

cout << RUS(«Введите строку из 3 символов») << ‘\n’;

cout << RUS(«Вы ввели: «) << myString;

Читайте так же:
Видеокарта включается и сразу выключается

Определение длины строк

Очень часто при работе со строками необходимо знать, сколько символов содержит строка. Для выяснения информации о длине строки в заголовочном файле string.h описана функция strlen(). Синтаксис этой функции имеет вид:

size_t strlen(const char* string)

Данная функция в качестве единственного параметра принимает указатель на начало строки string, вычисляет количество символов строки и возвращает полученное беззнаковое целое число (size_t). Функция strlen () возвращает значение на единицу меньше, чем отводится под массив по причине резервирования места для символа ‘ \0’. Следующий фрагмент демонстрирует использование функции strlen ():

char Str[] = «ABCDEFGHIJK»;

Часто функция sizeof () используется при вводе строк в качестве второго параметра конструкции cin.getline (), что делает код более универсальным, так как не требуется явного указания числа вводимых символов. Если теперь потребуется изменить размер символьного массива, достаточно модифицировать лишь одно число при объявлении строки символов:

cin.getline(myString, sizeof(myString))

Копирование строк

Значения строк могут копироваться из одной в другую. Процедура идентична копированию массива. Например, в приведенной ниже программе содержимое строки bufRus копируется в строку Str. Копирование прекращается в случае достижения нуль-терминатора (‘\0’) строки bufRus, поэтому перед копированием необходимо удостовериться, что длина bufRus меньше или равна длине Str. В противном случае возможно возникновение ошибок.

int i=0;//i – счетчик букв

RUS(«Проверка копирования»);//Занесение русского текста в bufRus

while (bufRus[i]!=’\0′) //Проверка на конец копируемого массива

В библиотеке string.h для копирования используют ряд стандартных функций.

Функция strcpy () имеет прототип:

char* strcpy(char* strl, const char* str2)

и выполняет побайтное копирование символов из строки, на которую указывает str2, в строку по указателю strl.

Например, следующий фрагмент копирует в строку Str значение строки «Проверка копирования»:

strcpy(Str, RUS(«Проверка копирования»)) ;

Можно производить копирование не всей строки, а лишь отдельного ее фрагмента (до конца строки). При этом второй параметр является указателем на некоторый элемент строкового массива. Например, следующий фрагмент скопирует в str2 окончание строки Str:

char Str[21],str2[21];

strcpy(Str, RUS(«Проверка копирования»));

// ptr теперь указывает на

При выполнении программы будет выведен текст: копирования.

Функция strncpy () отличается от strcpy () тем, что в ее параметрах добавляется еще один аргумент, указывающий количество символов, не больше которого будет скопировано. Ее синтаксис имеет вид:

char* strncpy(char* strl, const char* str2, size_t num)

Если длина strl меньше длины str2, происходит урезание символов:

char cLong[] = «012345678901234567890123456789»;

strncpy(cShort, cLong, 4);

В результате будет выведено:

То есть из строки cLong в строку cShort скопировано четыре первых символа, заменив, тем самым, исходное значение начала короткой строки.

Функция strdup () в качестве параметра получает указатель на строку-источник, осуществляет распределение памяти, копирует в отведенную область строку и возвращает указатель на начало полученной строки-копии. Синтаксис функции следующий:

char* strdup(const char* source)

В следующем примере производится копирование строки strl в строку str2:

str1=new char[21];//динамическое выделение памяти

strcpy(str1, RUS(«Процедура не найдена»));

Конкатенация (сцепление) строк

Конкатенация или сцепление строк может быть реализовано путем добавления одного массива в другой:

char Str1[10],Str2[10],Str3[20],Str4[11]=», and \0″;

printf(«Input string too: «);

printf(«You input: %s\n»,Str3);

Функция strcat() библиотеки string.h сцепляет строки точно также:

char Str1[10],Str2[10],Str4[11]=», and \0″;

printf(«Input string too: «);

printf(«You input: %s\n»,Str1);

Данный пример хорош только для англоязычных строк. Применение русских букв вызовет затруднения. Задать, например, русскоязычную константу не удастся, поскольку в инициализаторе нельзя применять функции. Поэтому следует использовать прямое обращение к массиву bufRus:

char Str1[100],Str2[10];

printf(RUS(«Введите еще строку: «));

Функция strncat() также осуществляет конкатенацию строк, однако, присоединяет лишь указанное в третьем параметре количество символов (беззнаковое целое):

char* strncat(char* strl, const char* str2, size_t num)

Читайте так же:
Вирус который перезагружает компьютер

Функция возвращает указатель на начало сформированной строки strl.

Сравнение строк

Сравнение строк необходимо при поиске строк заданного содержания в тексте. В простейшем случае нужно сравнить 2 строки с начала до конца и ответить на вопрос равны они или нет. Приведенная ниже программа использует для этого цикл сравнения и логическую переменную PrEqu.

strcpy(Str, RUS(«Проверка копирования»));

int i=0;bool PrEqu=false; //i — счетчик букв

RUS(«Проверка копирования»);//Занесение русского текста в bufRus

while (bufRus[i]!=’\0′) //Проверка на конец копируемого массива

//Если буквы не совпали выход из цикла

// с отрицательным результатом PrEqu=false

i++;PrEqu=true;> //цикл сравнения

if (PrEqu) cout<<RUS(«строки равны»);

else cout<<RUS(«строки не равны»);

Библиотека функций string.h предлагает к использованию готовые функции, выполняющие сравнение строк. Ниже приводятся функции, выполняющие посимвольное сравнение двух строк

Функция strcmp () имеет синтаксис:

int strcmp(const char* strl, const char* str2)

После сравнения строк strl и str2 данная функция возвращает в результате одно из следующих значений:

• <0-еслистрока strl меньше, чем str2;

• =0 — если строки эквивалентны;

• >0 — если строка strl больше, чем str2. Эта функция производит сравнение, различая прописные и строчные буквы. Следующий пример иллюстрирует работу функции strcmp ():

char strl[]=»Ошибка открытия базы»;

char str2[]=»Ошибка открытия Базы»;

i = strcmp(strl, str2);

В результате переменной i будет присвоено положительное значение, так как строка из strl меньше, чем строка из str2, по той причине, что прописные буквы имеют код символов меньше, чем строчные (слово «базы » в первом случае начинается со строчной литеры, а во втором — с прописной).

Функция stricmp () имеет синтаксис:

int stricmp(const char* strl, const char* str2)

Данная функция сравнивает строки strl и str2, не различая регистра символов. Возвращается одно из следующих целочисленных значений:

• <0-еслистрока strl меньше, чем str2;

• =0 — если строки эквивалентны;

• >0 — если строка strl больше, чем str2.

Следующий фрагмент программы демонстрирует применение функции stricmp ():

char strl[]=»Moon»;

i = stricmp(strl, str2);

В данном случае переменной i будет присвоено значение 0 (сигнализируя тем самым совпадение строк), так как strl и str2 отличаются только регистром.

Функция strncmp () проводит сравнение определенного числа первых символов двух строк. Регистр символов при этом учитывается. Функция имеет следующий прототип:

int strncmp(const char* strl, const char* str2, size_t num)

Данная функция сравнивает num первых символов двух строк, на которые указывают strl и str2, и возвращает одно из следующих значений:

• <0 — если строка strl меньше, чем str2;

• =0 — если строки эквивалентны;

• >0 — если строка strl больше, чем str2.

Рассмотрим пример использования функции strncmp ().

char strl[]=»Ошибка открытия базы»;

char str2[]=»Ошибка Открытия базы»;

i = strncmp(strl, str2, 12);

В результате сравнения первых 12-ти символов обеих строк переменная i получит положительное значение, так как подстроки «Ошибка откры» и «Ошибка Откры» отличаются одним символом и в первом случае код символа больше, чем во втором.

Функция strnicmp () производит сравнение определенного числа первых символов двух строк, не обращая внимания на регистр символов. Данная функция описана следующим образом:

int strnicmp(const char* strl, const char* str2, size_t num)

Функция возвращает целочисленное значение согласно правилу:

• <0 — если строка strl меньше, чем str2;

• =0 — если строки эквивалентны;

• >0 — если строка strl больше, чем str2. В следующем примере производится сравнение заданного числа символов подстрок:

char strl[]=»Opening error»;

char str2[]=»Opening Error. «;

i = strnicmp(strl, str2, 13);

В результате переменной i будет присвоено значение 0, так как первые 13 символов обеих подстрок отличаются только регистром.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector