Ввод и вывод данных
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Ввод и вывод
данных
Курс «Разработка ПО систем управления»
Кафедра управления и информатики НИУ «МЭИ»
Осенний семестр 2017 г.
Функции printf() и scanf()
• Форматная строка аналогична MATLAB.
• Но только для скалярных значений.
• Корректность не проверяется, результат непредсказуем.
• Функция printf () не работает со string напрямую:
string hello = "hello";
printf ( "%s", hello . c_str() );
• Подробная справка по форматной строке: [cppref].
• float value;
scanf ( "%f", &value );
• Некорректный вызов приведет к порче памяти!
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
2
Работа с файлами в C
Тип-указатель (не разыменовывается), обозначающий открытый файл.
Режим доступа [cppref]:
" r " — чтение текста;
"w" — перезапись файла;
"a" — дозапись в конец.
FILE* file = fopen ( "name.ext", "r" );
fscanf ( file, "%d", &number );
string line(120, '\0');
fgets ( line . data(), line . size(), file );
fprintf ( file, "%4.2f", 3.14 );
fputs ( line . c_str(), file );
1. Строка из 120 символов '\0'.
2. Это специальный символ
«конец строки».
fseek ( file, 0, SEEK_END );
long position = ftell ( file );
fclose ( file );
Осень 2017 г.
Перемещение на 0 символов от конца,
то есть к концу файла. См. также [cppref].
© Кафедра УиИ НИУ «МЭИ»
3
Ввод и вывод в C++ (1)
• #include
• Поток (stream) — тип данных,представляющий нечто,
откуда можно читать данные (поток ввода)
или куда можно записывать данные (поток вывода):
• ifstream — тип потоков ввода из файла (см. далее);
• ostringstream — тип потоков для вывода в строку (см. далее);
• cin — переменная-поток стандартного ввода
(обычно с клавиатуры);
• cout — переменная-поток стандартного вывода
(обычно на экран).
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
4
Ввод и вывод в C++ (2)
• Читают оператором >>:
cin >> x;
• Выводят оператором <<:
cout << "hello!";
• Эти операторы поддерживаются для встроенных типов.
• Можно определить их для собственных типов,
но это выходит за рамки курса.
• Поток может быть текстовым или двоичным —
код работы с ним не меняется
(оператор будет читать или писать в другом формате сам).
• При вводе из текстовых потоков разделитель значений —
один и более пробельных символов (пробел, перевод
строки, табуляция).
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
5
Файловый в/в С++
Или:
ifstream input;
input . open ( "file.txt" );
▪ Ничего или ios::out.
▪ ios_base :: ate — дописывать в конец,
• Append (Output) в Pascal;
▪ ios_base :: trunc — очистить файл перед записью,
• Ввод:
• Truncate (Output) в Pascal.
ifstream input ( "file.txt" );
input >> temperature;
• Вывод:
ofstream output ( "file.txt", режим );
output << "Result: " << result << '\n';
• Закрытие — автоматически или output . close().
• Работа с файлами подобна работе с cin и cout.
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
6
Потоки в памяти,
или «как превратить строку в число?»
Из строки вычитываются слова,
разделенные пробелами.
• string input;
getline(cin, input);
stringstream source(input);
size_t count = 0;
for (string word; source >> word; ++count);
cout << "Word count: " << count << '\n';
Тело цикла пустое:
• int parse ( string text ) {
++count и есть подсчет слов.
stringstream stream ( text );
int result;
stream >> result;
• stringstream
Чтение и запись.
return result;
• istringstream Только чтение.
}
• ostringstream Только запись.
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
7
Тонкость: ввод целых строк
Содержимое потока:
(что остается считать)
4
• size_t count;
cin >> count;
string line;
getline(cin, line); // line == ""
2
\n
h
i
\n
\n
h
i
\n
h
i
\n
• getline() считывает до '\n'.
Он встретился сразу → считано 0 символов.
• Нужно считать из потока этот лишний '\n', варианты:
• cin.ignore();
// проигнорирован 1 символ
• getline(cin, line); // проигнорирован перевод строки
getline(cin, line); // считана следующая строка: "hi\n"
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
8
Форматный вывод
Действует на cout все время
после установки.
double value = 12.34567;
▪ cout << setprecision ( 2 );
▪ cout << value
// 12
…значащих цифр
<< fixed
<< value // 12.35
…цифр после запятой
<< scientific
<< value // 1.23e+01
…цифр после запятой
в мантиссе
<< defaultfloat << value; // 12
Действуют только
на следующее
выводимое
значение.
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
9
Форматный вывод
(продолжение)
• cout << setw (15) << setfill ( '.' ) << left
<< "Code:"
<< setw (4) << setfill ( '0' ) << right << 12;
• Code:..........0012
• cout << endl;
• cout << '\n';
cout . flush();
Осень 2017 г.
Форматный вывод в C++ устроен сложнее,
чем в C, но на самом деле он гибче,
т. к. параметры форматирования
легко менять во время работы.
© Кафедра УиИ НИУ «МЭИ»
10
Параметры командной строки
Приглашение (prompt).
$ g++ -o program main.cpp
Имя программы
(исполняемого файла).
Аргументы командной строки.
• Программа может получить аргументы, с которыми вызвана.
• И имя, под которым вызвана (как аргумент № 0).
• Аргументы с дефисами в начале иногда называют
опциями (options).
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
11
Разбор параметров
командной строки
int main ( int argc, char* argv[ ] )
{
for (int i = 0; i < argc; i++) {
cout << "argv[" << i << "] = " << argv[ i ] << endl;
}
}
$ ./program -o option 123 --long-option=value -ab
argv[0] = ./program
argv[1] = -o
argv[2] = option
argv[3] = 123
argv[4] = --long-option=value
argv[5] = -ab
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
Для многих программ
это эквивалентно -a -b,
но это их внутренняя
логика!
12
Что значит char* argv[] ?
• argv [ ] значит, что argv — это массив.
• …массив значений аргументов (argument values).
• Количество элементов — argc (argument count).
• Тип каждого элемента — char *
• char — это символ.
• char * — указатель на символ:
• Указатель содержит адрес памяти,
т. е. место, где хранится что-либо (здесь: символ).
• Строка — цепочка символов,
имеем указатель на первый символ в ней.
• Итого: массив мест, где начинаются строки-аргументы.
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
13
Пример разбора параметров
командной строки Неправильно сравнивать
адрес данных argv[1]
с адресом константы "-h".
Тип string сравнит значения.
int main ( int argc, char* argv[ ] )
{
if ( argc > 1 && string( argv[1] ) == "-h" ) {
cout << "Программа вычисляет оценки " <<
"математического ожидания и дисперсии."
}
$ ./program -h
// …
Программа вычисляет оценки математического ожидания и дисперсии.
}
$ ./program
Введите количество чисел:
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
14
О командной строке
• На практике командную строку разбирают
с помощью библиотек (getopt, Boost . ProgramOptions).
• С ключом -h, --help, -?, --usage
принято отображать краткую справку.
• Если типичный запуск требует много опций,
имеет смысл сделать текстовый файл настроек.
• В Windows вместо -f принято /F ( / вместо - ).
От этого отказываются. Не нужно так делать.
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
15
Литература к лекции
▪ Programming Principles and Practices Using C++:
• глава 4, раздел 4.5 — функции;
• глава 6, раздел 6.5 — декомпозиция;
• глава 8 (пункт 8.5.8 — опционально);
• пункт 9.4.1 — структуры, раздел 9.5 — перечисления;
• упражнения к главам 4 и 8.
▪ C++ Primer:
• глава 2, раздел 2.3 — указатели и ссылки;
• глава 6 — функции;
• раздел 19.3 — перечисления;
• упражнения.
Осень 2017 г.
© Кафедра УиИ НИУ «МЭИ»
16