double arrow

Массив неизвестного размера


Прмер. В файле input.datзаписаны в два столбика пары чисел (x,y). Записать в файл

output.datв столбик суммы x+yдля каждой пары.Сложность этой задачи состоит в том, что мы не можем прочитать все данные сразу в память,обработать их и записать в выходной файл. Не можем потому, что не знаем, сколько пар чисел в массиве. Конечно, если известно, что в файле, скажем, не более 200 чисел, можно выделить массив «с запасом», прочитать столько данных, сколько нужно, и работать только с ними. Однако в файле могут быть миллионы чисел и такие массивы не поместятся в памяти.

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

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

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

1) открыть два файла, один на чтение (с исходными данными), второй – на запись;

2) попытаться прочитать два числа в переменные xи y; если это не получилось (нет больше данных или неверные данные), закончить работу;

3) сложить xи yи записать результат в выходной файл;

4) перейти к шагу 2.

Для того, чтобы определить, удачно ли закончилось чтение, мы будем использовать тот факт,что функция fscanf(как и scanf) возвращает количество удачно считанных чисел. За один раз будем читать сразу два числа, xи y. Если все закончилось удачно, функция fscanfвозвращает значение 2 (обе переменных прочитаны). Если результат этой функции меньше двух,данные закончились или неверные.

Заметим, что надо работать одновременно с двумя открытыми файлами, поэтому в памяти

надо использовать два указателя на файлы, они обозначены именами finи fout. Для сокращения записи ошибки при открытии файлов не обрабатываются.


Сейчас читают про: