Перейти к содержанию

1.2 Ввод и вывод

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

В языке C++:

  • cin — поток ввода
  • cout — поток вывода

Также можно использовать функции языка C: scanf и printf.


Чтение данных через cin

Обычно входные данные состоят из чисел и строк, разделённых пробелами или переводами строки.

Пример чтения данных:

int x, y;
string name;

cin >> x >> y >> name;

Этот код корректно работает, если элементы разделены хотя бы одним пробелом или переносом строки.

Оба варианта ввода будут обработаны одинаково:

45 78 panda

или

45 78
panda

Вывод данных через cout

Пример вывода:

int x = 45, y = 78;
string name = "panda";

cout << x << " - " << y << " : " << name << "\n";

Обратите внимание: "\n" работает быстрее, чем endl, потому что endl дополнительно выполняет принудительную очистку буфера (flush).


Ускорение ввода и вывода

Иногда ввод и вывод становятся узким местом программы. Чтобы ускорить работу cin и cout, добавьте в начало main():

ios::sync_with_stdio(false);
cin.tie(nullptr);

Это отключает синхронизацию с C-потоками и ускоряет работу программы.


Использование scanf и printf

Функции языка C обычно немного быстрее, но менее удобны.

Чтение:

int x, y;
scanf("%d %d", &x, &y);

Вывод:

int x = 45, y = 78;
printf("%d - %d\n", x, y);

Чтение целой строки

Если нужно считать строку целиком (включая пробелы), используется getline:

string line;
getline(cin, line);

Например, строка

Hello competitive programming

будет считана полностью, включая пробелы.


Чтение данных неизвестного объёма

Если заранее неизвестно, сколько данных будет во входе, удобно использовать цикл:

int value;
while (cin >> value) {
    // обработка value
}

Цикл продолжается до тех пор, пока во входном потоке есть данные.


Работа с файлами

В некоторых системах соревнований ввод и вывод осуществляется через файлы.

Можно оставить стандартный код, добавив в начало программы:

freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);

После этого программа будет читать данные из файла data.in и записывать результат в data.out.


Главное, что нужно запомнить

  • В соревнованиях чаще всего используются стандартные потоки.
  • Для ускорения подключайте ios::sync_with_stdio(false) и cin.tie(nullptr).
  • Используйте "\n", а не endl.
  • Для чтения строк с пробелами используйте getline.
  • При большом объёме данных ввод/вывод может быть критичен для прохождения по времени.