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. Для сокращения записи ошибки при открытии файлов не обрабатываются.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



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