Алгоритмические языки и программирование. Учебное пособие
.pdf
Иерархия
Потоковые классы образуют иерархию наследования. Базовым классом является класс 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
