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

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

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
91
Иерархия
Потоковые классы образуют иерархию наследования. Базовым классом
является класс 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>.
92
Пример использования манипуляторов:
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 символов
или до конца файла
93
Класс 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)
без параметров очищает все флаги,
с параметром – устанавливает переданный
флаг.
94
/***
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
95
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
}
96
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>). Их особенность в
том, что поток направлен в память, но при этом можно использовать все
возможности потоков по форматированию вывода.
97
Пример использования строковых потоков:
#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 являются количе ство параметров командной строки
и массив строк со значениями параметров. Всегда присутствует хотя бы один
98
параметр – в качестве нулевого элемента массива параметров хранится имя
самой программы.
Пример: вывод на экран количество и значения параметров командной
строки
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;
}
99
Библиографический список
1. Хортон А. Visual C++ 2010: полный курс / А. Хортон.
М.: Диалектика, 2010.
2. Страуструп Б. Язык программирования C++ / Б. Страуструп.
М. : Бином-Пресс, 2007.
3. Шилдт Г. Полный справочник по C++ / Г. Шилдт. 4-е изд.
М. : Вильямс, 2011.
4. Кениган Б. Язык программирования Cи / Б. Кениган, Д. Ритчи.
2-е изд. М. : Вильямс, 2007.
5.
Павловская Т. А. С/С++. Программирование на языке высокого уровня /
Т. А. Павловская. СПб. : Питер, 2004.
Приложение
Команда Описание
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]