Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмические языки и программирование. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
997 Кб
Скачать

Иерархия

Потоковые классы образуют иерархию наследования. Базовым классом является класс ios. Его потомки – классы для работы с входными потоками istream и выходными ostream, классы для работы с файлами на чтение ifstream и файлами на запись ofstream.

Форматирование

Одним из способов форматированного вывода данных является установка флагов с помощью методов setf (установить флаг) и unsetf (снять флаг). Сами флаги хранятся в базовом классе ios. Установленный флаг влияет на форматирование до тех пор, пока он не будет снят.

int main(){

cout. setf (ios :: left);//to adjust the text to the left cout << "This text is adjusted to the left\n"; cout.unsetf (ios :: left);//reject the formatting return 0;

}

Более удобным способом является применение манипуляторов. Манипуляторы оказывают влияние только на вывод после них. Одним манипулятором мы уже давно пользуемся – это endl. Для использования более сложных нужно подключить библиотеку #include<iomanip>.

91

Пример использования манипуляторов: int main(){

cout << setw(20) //width of the field

<<setfill('*') //fill symbol

<<setprecision(10) //number of decimal digits

<<fixed /*fixed point position*/<< 0.01;

return 0;

}

Класс istream

Основные функции класса istream приведены ниже.

Функция

 

Назначение

 

 

 

 

>>

Извлечь данные из потока

 

 

 

 

get (ch)

Извлечь один символ в ch

 

 

 

get (str)

Извлечь символы в массив str до

 

ограничителя '\n'

 

 

 

 

get (str, MAX)

Извлечь до числа MAX символов в массив

 

 

get (str, DELIM)

Извлечь символы в массив до ограничителя.

 

Оставляет ограничитель в потоке

 

 

 

get (str, MAX, DELIM)

Извлечь в массив до MAX символов или до

 

ограничителя

DELIM.

Оставляет

 

ограничитель в потоке

 

 

 

getline (str, MAX, DELIM)

Извлечь в массив до MAX символов или до

 

ограничителя

DELIM.

Извлекает

 

ограничитель из потоке

 

 

 

 

putback(ch)

Вставляет символ обратно в поток

 

 

 

ignore (MAX, DELIM)

Извлечь и удалить до MAX символов или до

 

ограничителя DELIM включительно. С

 

извлеченными символами ничего не делает

 

 

peek (ch)

Читает один символ, оставляя его в потоке

 

 

read (str, MAX)

(Для файлов) Извлекает до MAX символов

 

или до конца файла

 

 

 

 

 

92

Класс ostream

Основные функции класса ostream приведены ниже.

Функция

Назначение

 

 

<<

Вывод данных в поток

 

 

put(ch)

Вставить символ в поток

 

 

flush()

Очистка буфера

 

 

write(str, SIZE)

Вставка SIZE символов из массива str в файл

 

 

Предопределенные потоки

В библиотеке iostream предопределены четыре потоковые переменные: для чтения из стандартного потока ввода – cin, для записи в стандартный поток вывода – cout, для вывода сообщений об ошибках – cerr, для регистрации хода работы программы – clog. Два последних по умолчанию связаны со стандартным потоком вывода. Потоки cout и clog – буферизированные, т. е. отправленные в поток данные накапливаются в промежуточной области памяти (буфере) до тех пор, пока буфер на заполнится, не будет вызван метод flush или поток не будет закрыт. Устройства вывода обычно медлительные и при частом к ним обращении работа программы существенно замедляется. Для уменьшения количества обращений к устройствам вывода применяется буфер. Поток cerr – не буферизированный.

Ошибки

Для информирования о состоянии потока используются внутренние флаги потока. Для проверки их состояния существует набор методов: метод eof() возвращает true, если достигнут конец потока, метод fail() возвращает true, если произошла ошибка, метод bad() возврщает true, если произошла серьезная ошибка, метод good() возвращает true, если поток в порядке, метод clear(int fl) без параметров очищает все флаги, с параметром – устанавливает переданный флаг.

93

/***

input checking with English Distance class

****/

 

#include <iostream>

 

#include <string>

 

#include <cstdlib>

//for atoi(), atof()

using namespace std;

 

int isFeet(string);

//declaration

//===============================================

class Distance{

//English Distance class{

private:

 

int feet;

 

float inches;

 

public:

 

Distance(){

 

feet = 0;

 

inches = 0.0;

 

}

Distance(int ft, float in){ feet = ft;

inches = in;

}

void showdist(){ //display distance cout << feet << "\'-" << inches << '\"';

}

 

void getdist();

//get length from user

};

 

//--------------------------------------------------------------

 

void Distance::getdist(){

//get length from user

string instr;

//for input string

while(true){

//cycle until feet are right

cout << "\n\nEnter feet: ";

cin.unsetf (ios::skipws); //do not skip white space cin >> instr; //get feet as a string

94

if (isFeet(instr)){

//is it a correct feet value?

//yes

 

 

cin.ignore(10, '\n'); //eat chars, including newline

feet = atoi( instr.c_str() ); //convert to integer

break;

 

//break out of 'while'

}

//no, not an integer

cin.ignore(10, '\n');

//eat chars, including newline

cout << "Feet must be an integer less than 1000\n";

} //end while feet

 

 

while(true){

//cycle until inches are right

cout << "Enter inches: ";

cin.unsetf(ios::skipws); //do not skip white space

cin >> inches;

 

//get inches (type float)

if(inches>=12.0 || inches<0.0){

cout << "Inches must be between 0.0 and 11.99\n"; cin.clear(ios::failbit); //"artificially" set fail bit

}

 

 

if( cin.good() ){

 

//check for cin failure

//(most commonly a non-digit)

cin.ignore(10, '\n'); //eat the newline

break;

 

//input is OK, exit 'while'

}

 

 

cin.clear();

 

//error; clear the error state

cin.ignore(10, '\n');

//eat chars, including newline

cout << "Incorrect inches input\n"; //start again

} //end while inches

 

 

}

 

 

//--------------------------------------------------------------

int isFeet(string str){

//return true if the string

// is a correct feet value

 

 

int slen = str.size();

//get length

if(slen==0 || slen > 5){

 

//if no input, or too long

return 0;

 

//not an int

}

 

 

95

for(int j=0; j<slen; j++){

//check each character

//if not digit or minus

 

 

if( (str[j] < '0' || str[j] > '9') && str[j] != '-' ){

return 0;

//string is not correct feet

}

 

 

}

 

 

double n = atof( str.c_str() ); //convert to double

if( n<-999.0 || n>999.0 ){

//is it out of range?

return 0;

 

//if so, not correct feet

}

 

 

return 1;

//it is correct feet

}

//===================================================== int main(){

Distance d; //make a Distance object char ans;

do{

d.getdist();

 

//get its value from user

cout << "\nDistance = ";

d.showdist();

 

//display it

cout << "\nDo another (y/n)? ";

cin >> ans;

 

 

cin.ignore(10, '\n');

//eat chars, including newline

} while(ans != 'n');

//cycle until 'n'

return 0;

 

 

}

Строковые потоки

Для форматированного вывода строк существует специальный вид потоковых классов strstream (библиотека #include<strstream>). Их особенность в том, что поток направлен в память, но при этом можно использовать все возможности потоков по форматированию вывода.

96

Пример использования строковых потоков:

#include <strstream> #include <iostream>

#include <iomanip> //for setiosflags() using namespace std;

int main(){

 

 

 

const int SIZE = 80;

 

//size of memory buffer

char ch = 'x';

//test data

int j = 77;

 

 

 

double d = 67890.12345;

 

 

char str1[] = "Kafka";

 

 

 

char str2[] = "Freud";

 

 

 

char membuff[SIZE];

 

//buffer in memory

ostrstream omem(membuff, SIZE);

//create stream object

omem << "ch=" << ch << endl

//insert formatted data

<< "j=" << j << endl

 

//into object

<< setiosflags(ios::fixed) //format with decimal point

<< setprecision(2)

//two digits to right of dec

<<"d=" << d << endl

<<"str1=" << str1 << endl

<<"str2=" << str2 << endl

<< ends;

//end the buffer with '\0'

cout << membuff;

//display the memory buffer

return 0;

 

}

Командная строка

Функция main(), как и любая функция, может принимать параметры. Но поскольку эта функция представляет собой всю программу, ее параметры поступают от операционной системы при запуске программы. Стандартными параметрами функции main являются количество параметров командной строки и массив строк со значениями параметров. Всегда присутствует хотя бы один

97

параметр – в качестве нулевого элемента массива параметров хранится имя самой программы.

Пример: вывод на экран количество и значения параметров командной строки

int main (int argc, char* argv[]){

cout << "\nargc = " << argc << endl; //number of arguments for(int j=0; j<argc; j++) //display arguments

cout << "Argument " << j << " = " << argv[j] << endl; return 0;

}

Пример: печать на экране заданного файла:

#include <fstream>

//for file functions

#include <iostream>

 

using namespace std;

 

#include <process.h>

//for exit()

int main (int argc, char* argv[]){ if (argc != 2){

cerr << "\nFormat: otype filename";

exit(-1);

 

 

}

 

 

char ch;

//character to read

ifstream infile;

//create file for input

infile.open( argv[1] );

//open file

if (!infile){

//check for errors

cerr << "\nCan't open " << argv[1];

exit(-1);

 

 

}

 

 

while (infile.get(ch) != 0){

//read a character

cout << ch;

//display the character

}

 

 

return 0;

}

98

Библиографический список

1.

Хортон

А.

Visual

C++ 2010:

полный

курс

/

А. Хортон.

 

М.: Диалектика, 2010.

 

 

 

 

 

 

 

2.

Страуструп

Б.

Язык

программирования

C++

/

Б.

Страуструп.

 

М. : Бином-Пресс, 2007.

 

 

 

 

 

 

 

3.

Шилдт

Г.

Полный справочник по

C++

/

Г.

Шилдт. 4-е изд.

 

М. : Вильямс, 2011.

 

 

 

 

 

 

 

4.

Кениган

Б.

Язык

программирования

Cи /

Б.

Кениган,

Д. Ритчи.

 

2-е изд. М. : Вильямс, 2007.

 

 

 

 

 

 

5.Павловская Т. А. С/С++. Программирование на языке высокого уровня / Т. А. Павловская. СПб. : Питер, 2004.

99

Приложение

Команда

Описание

Ctrl-X или

Вырезает текущее выделение в буфер обмена

Shift-Delete

 

Ctrl-C или

Копирует текущее выделение в буфер обмена

Ctrl-Insert

 

Ctrl-V или

Вставляет элемент из буфера обмена под курсор

Shift-Insert

 

Ctrl-Z или

Отменяет предыдущее редактирование

Alt-Backspace

 

Ctrl-Y или

Повторяет предыдущее редактирование

Ctrl-Shift-Z

 

Ctrl-Shift-V или

Вставляет элемент из кольцевого буфера обмена под курсор и

Ctrl-Shift-Insert

автоматически выделяет вставленный элемент. Цикл по элементам в

 

буфере проходит по повторному нажатию клавиш

Esc

Закрывает меню или диалог, отменяет операцию или перемещает

 

фокус на окно стекущим документом

 

 

Ctrl-S

Сохраняет выбранный файл в текущем проекте (обычно

 

редактируемый файл)

Ctrl-Shift-S

Сохраняет все документы и проекты

F8

Перемещает курсор к следующему элементу, например к ошибке или

 

результату поиска

 

 

Shift-F8

Перемещает курсор к предыдущему элементу, например к ошибке

 

или результату поиска

 

 

Shift-F12

Ищет ссылку на выбранный элемент или элемент под курсором

Left Arrow

Перемещает курсор на один символ влево

Right Arrow

Перемещает курсор на один символ вправо

Down Arrow

Перемещает курсор на одну строку вниз

Up Arrow

Перемещает курсор на одну строку вверх

Page Down

Перелистывает вниз на один экран

Page Up

Перелистывает вверх на один экран

End

Перемещает курсор в конец текущей строки

Home

Перемещает курсор в начало текущей строки

Ctrl-End

Перемещает курсор в конец документа

Ctrl-Home

Перемещает курсор в начало документа

Ctrl-G

Отображает диалог «Переход к строке»

Ctrl-]

Перемещает курсор к соответствующей скобке в документе.

100

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]