Файлы

Для работы с файлами из своей программы необходимо:

  1. Подключить заголовочный файл fstream, содержащий описание функций, позволяющих работать с файловыми потоками.
  2. Для чтения данных необходимо создать переменную (объект) типа ifstream, связав его с файлом на диске. Чтение данных из файла осуществляется также, как из стандартного ввода при помощи оператора “>>
  3. Для вывода данных необходимо создать переменную (объект) типа ofstream, связав его с файлом на диске. Запись данных в файл осуществляется также, как на стандартный вывод при помощи оператора “<<

Если при связывании объектов с файлами указывается только имя файла (а не полный путь), то файл должен располагаться в текущем каталоге (там же, где и запускаемая программа).

Пример работы с файлами:

#include <fstream>
using namespace std;

ifstream fin("input.txt");
ofstream fout("output.txt");

int main()
{
    int a, b;
    fin >> a >> b ; // Считать числа a и b из файлового потока fin
    fout << a + b << endl;
    return 0;
}

Напоминаем, что строки можно считывать из файла двумя способами - до пробельного символа при помощи оператора fin >> S и до конца строки при помощи функции getline(fin, S).

Также из листка про строки рекомендуется вспомнить, как читать данные посимвольно или построчно до конца файла, как работает манипулятор noskipws.

Упражнения

В задачах J-Z этого листка нельзя сохранять все входные данные в массиве, размер которого определяется количеством записей во входном файле, за исключением тех задач, где явно сказано произвести сортировку всех записей входного файла по заданному критерию. Также в этих задачах запрещается повторное считывание входного файла.

Входные данные записаны в файле input.txt, результат работы нужно вывести в файл output.txt.

A: A + B

Во входном файле записано два целых числа, не превосходящие 2×109 по модулю. Выведите в выходной файл их сумму.

Ввод Вывод
2 2
4

B: Обращение строки

Во входном файле записана одна текстовая строка, возможно, содержащая пробелы. Выведите эту строку в обратном порядке.

Строка во входном файле заканчивается символом конца строки '\n'. Вы также должны вывести конец строки в выходной файл.

Ввод Вывод
hello world
dlrow olleh

C: Построчное обращение

Выведите все строки данного файла в обратном порядке. Для этого создайте массив строк, считайте файл построчно в данный массив, затем выведите строки из массива в обратном порядке.

Количество строк в файле не превосходит 1000.

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Complex is better than complicated.
Simple is better than complex.
Explicit is better than implicit.
Beautiful is better than ugly.

D: Обращение всего файла

Выведите в обратном порядке содержимое всего файла полностью. Для этого считайте весь файл посимвольно и запишите его в массив символов. Не забудьте про noskipws!

Количество байт в файле не превосходит 106.

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.

.detacilpmoc naht retteb si xelpmoC
.xelpmoc naht retteb si elpmiS
.ticilpmi naht retteb si ticilpxE .ylgu naht retteb si lufituaeB

E: Длинные строки

В выходной файл выведите все строки наибольшей длины из входного файла, не меняя их порядок.

В этой задаче удобно считать файл два раза: при первом считывании файла определить длину самой длинной строки, при втором считывании файла вывести все строки такой длины.

Для повторного считывания файла сначала нужно закрыть ранее открытый файл при помощи метода close(), потом заново открыть его при помощи метода open с параметром — именем файла:

fin.close();
fin.open("input.txt");
Ввод Вывод
One
Twenty one
Two
Twenty two
Twenty one
Twenty two

F: Поиск символа

Определите, есть ли во входном файле символ '@'. Выведите слово YES или NO.

Входной файл может быть очень большим, поэтому считывать файл нужно посимвольно.

Ввод Вывод
Valid email:
Bilbo.Baggins@bagend.hobbiton.shire.me
YES
Hello, world!
NO

G: Сумма чисел в файле

В файле могут быть записаны десятичные цифры и все, что угодно. Числом назовем последовательность цифр, идущих подряд (т.е. число всегда неотрицательно).

Вычислите сумму всех чисел, записанных в файле. В данной задаче удобно считывать данные посимвольно, не забудьте про noskipws.

Ввод Вывод
 123
aaa456
1x2y3 4 5 6
600

H: Статистика по файлу

Дан файл. Определите сколько в нем букв (латинского алфавита), слов, строк. Выведите три найденных числа в формате, приведенном в примере.

Слово — это последовательность букв (заглавных и строчных) латинского алфавита.

Для экономии памяти читайте файл посимвольно, то есть не сохраняя целиком в памяти файл или отдельные его строки.

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Input file contains:
108 letters
20 words
4 lines

I: Шифр Цезаря - 2

Зашифруйте данный текстовый файл шифром Цезаря, при этом символы первой строки файла должны циклически сдвигаться на 1, второй строки — на 2, третьей строки — на три и т.д.

В этой задаче удобно считывать файл построчно, шифруя каждую строку в отдельности.

Ввод Вывод
Hello
Hello
Hello
Hello
Ifmmp
Jgnnq
Khoor
Lipps

J: Максимальный балл по классам

В олимпиаде по информатике принимало участие несколько человек. Информация о результатах олимпиады записана в файле, каждая строка которого имеет вид:
фамилия имя класс балл.

Фамилия и имя — текстовые строки, не содержащие пробелов. Класс - одно из трех чисел 9, 10, 11. Балл - целое число от 0 до 100.

Победителем олимпиады становится человек, набравший больше всех баллов. Победители определяются независимо по каждому классу.

Определите количество баллов, которое набрал победитель в каждом классе. Гарантируется, что в каждом классе был хотя бы один участник.

Выведите три числа: баллы победителя олимпиады по 9 классу, по 10 классу, по 11 классу.

Ввод Вывод
Иванов Сергей 9 90
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
93 91 92

K: Средний балл по классам

В условиях предыдущей задачи определите и выведите средние баллы участников олимпиады в 9 классе, в 10 классе, в 11 классе.

Ввод Вывод
Иванов Сергей 9 90
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
91.5 91 92

L: Количество победителей по классам

В условиях предыдущей задачи определите количество школьников, ставших победителями в каждом классе. Победителями объявляются все, кто набрал наибольшее число баллов по данному классу. Гарантируется, что в каждом классе был хотя бы один участник.

Выведите три числа: количество победителей олимпиады по 9 классу, по 10 классу, по 11 классу.

Ввод Вывод
Иванов Сергей 9 80
Сергеев Петр 10 80
Петров Василий 11 81
Васильев Андрей 9 81
Андреев Александр 10 80
Александров Роман 9 81
Романов Иван 11 80
2 2 1

M: Победитель олимпиады

Зачет в олимпиаде проводится без деления на классы. Выведите фамилию и имя победителя олимпиады. Если таких несколько - выведите только их количество.

Ввод Вывод
Иванов Сергей 9 90
Сергеев Петр 10 95
Петров Иван 11 85
Сергеев Петр
Иванов Сергей 9 90
Сергеев Петр 10 85
Петров Иван 11 90
2

N: Максимальный балл не-победителя

Зачет проводится отдельно в каждом классе. Победителями олимпиады становятся школьники, которые набрали наибольший балл среди всех участников в данном классе.

Для каждого класса определите максимальный балл, который набрал школьник, не ставший победителем в данном классе.

Выведите три целых числа.

Ввод Вывод
Иванов Сергей 9 80
Сергеев Петр 10 82
Петров Василий 11 82
Васильев Андрей 9 81
Андреев Александр 10 81
Александров Роман 9 81
Романов Иван 11 83
80 81 82

O: Максимальный балл призера и их количество

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

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

Ввод Вывод
Иванов Сергей 9 92
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
92 2

P: Имя наилучшего не-победителя

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

Ввод Вывод
Иванов Сергей 9 93
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
Петров Василий
Иванов Сергей 9 92
Сергеев Петр 10 91
Петров Василий 11 92
Васильев Иван 9 93
2

Q: Школы с наибольшим числом участников олимпиады

В олимпиаде по информатике принимало участие N человек. Информация о результатах олимпиады записана в файле, каждая из строк которого имеет вид:
фамилия имя школа балл

Фамилия и имя — текстовые строки, не содержащие пробелов. Школа — целое число от 1 до 99. Балл — целое число от 0 до 100.

Определите школы, из которых в олимпиаде принимало участие больше всего участников. Выведите номера этих школ в порядке возрастания.

В этой задаче необходимо считывать данные построчно, не сохраняя в памяти данные обо всех участниках, а только подсчитывая число участников для каждой школы.

Ввод Вывод
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
3 14

R: Школы с наименьшим числом участников олимпиады

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

Ввод Вывод
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
23 27

S: Отсортировать список участников по алфавиту

Известно, что фамилии всех участников — различны. Сохраните в массивах список всех участников и выведите его, отсортировав по фамилии в лексикографическом порядке.

При выводе указываете фамилию, имя участника и его балл.

Число строк в файле не превосходит 106.

Ввод Вывод
Иванов Сергей 14 56
Сергеев Петр 23 74
Петров Василий 3 99
Васильев Андрей 3 56
Андреев Роман 14 75
Романов Иван 27 68
Андреев Роман 75
Васильев Андрей 56
Иванов Сергей 56
Петров Василий 99
Романов Иван 68
Сергеев Петр 74

T: Отсортировать список участников по баллам

Отсортируйте список участников олимпиады:

  1. По убыванию набранного балла.
  2. При равных значения балла - по фамилии в лексикографическом порядке.
  3. При совпадающих баллах и фамилии - по имени в лексикографическом порядке.

Выведите список в таком же виде, как в предыдущей задаче.

Число строк в файле не превосходит 106.

Ввод Вывод
Иванов Сергей 14 75
Сергеев Петр 23 74
Сергеев Андрей 3 99
Петров Василий 3 99
Иванов Роман 14 75
Иванов Иван 27 76
Петров Василий 99
Сергеев Андрей 99
Иванов Иван 76
Иванов Роман 75
Иванов Сергей 75
Сергеев Петр 74

U: Школы, в которых есть победители олимпиады

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

Ввод Вывод
Иванов Сергей 13 80
Сергеев Петр 26 70
Сергеев Андрей 35 80
Петров Василий 13 80
Иванов Роман 35 70
Иванов Иван 26 70
13 35

V: Школы с высоким средним баллом

В условиях предыдущей задачи выведите в порядке возрастания номера школ, средний балл учащихся которых выше, чем средний балл всех участников олимпиады (то есть необходимо вычислить средний балл для каждой школы и средний балл по всем участникам).

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20

W: Школы с наибольшим средним баллом

В условиях предыдущей задачи выведите в порядке возрастания номера школ, средний балл учащихся которых максимален (то есть необходимо вычислить средний балл для каждой школы и вывести те школы, средний балл для которых максимален).

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20

X: Список школ упорядоченный по числу участников

В условиях предыдущей задачи выведите номера школ, из которых был хотя бы один участник олимпиады, в порядке убывания количества участников олимпиады из этих школ. Если из двух школ было одинаковое число участников, то их номера выводятся в порядке возрастания номера школы.

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 70 45
Сергеев Андрей 20 55
Петров Василий 14 55
Иванов Роман 13 40
Иванов Иван 70 60
13 70 14 20

Y: Список школ упорядоченный по среднему баллу участников

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

Ввод Вывод
Иванов Сергей 13 45
Сергеев Петр 13 45
Сергеев Андрей 20 55
Петров Василий 20 55
Иванов Роман 70 40
Иванов Иван 70 60
20 70 13

Z: Школы с наибольшим числом победителей

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

Ввод Вывод
Иванов Сергей 13 70
Сергеев Петр 13 60
Сергеев Андрей 20 70
Петров Василий 20 70
Иванов Роман 70 60
Иванов Иван 70 60
20