Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Чтение из файла






Оператор > > позволяет читать из файла данные любого типа. Считывание производится до первого пробельного символа (пробела, табуляции, символа перевода строки). Пробельный символ удаляется из потока, но в строку не записывается.

Метод get считывает один символ или строку определенной длины. У метода существует несколько прототипов. Рассмотрим их на примерах:

char x=file.get(); Метод без параметров считывает один символ, включая пробельные символы, и возвращает его код.
char x; file.get(x); Считывает один символ и записывает его в переменную, адрес которой передан в параметре.
char str[80]; file.get(str, 40); Считывает из файла строку из 39 символов, размещая ее в str. Если раньше встретится символ перевода строки, или будет достигнут конец файла, то считывание прекращается. Символ перевода строки остается в потоке. В конец строки записывается нулевой символ.
char str[80]; file.get(str, 40, '*'); Считывает из файла строку из 39 символов, размещая ее в str. Если раньше встретится символ «*» (символ-ограничитель, указанный в третьем аргументе), или будет достигнут конец файла, то считывание прекращается. Символ «*» остается в потоке. В конец строки записывается нулевой символ.

Метод peek читает из файла один символ и возвращает его код, при этом символ остается в потоке.

Метод getline читает строку из файла. Имеет такие же параметры, как третий и четвертый варианты метода get. В отличие от метода get символ перевода строки или символ-ограничитель удаляются из потока (но в строку по-прежнему не заносятся).

Метод ignore считывает указанное количество символов, но не сохраняет их. Можно задать символ-ограничитель. Если этот символ встретится раньше, чем будет прочитано нужное количество символов, то считывание прекращается. Символ-ограничитель считывается из потока. Например, file.ignore(10, '\n');

Метод read считывает указанное количество символов из потока, а также объект из двоичного файла. Параметры метода такие же, как у метода write. С помощью метода fail можно проконтролировать успешность считывания. Считывание может быть некорректным, например, если в файле меньше байтов, чем указано во втором параметре.

Часто при считывании нам нужно проверить, не достигли ли мы конца файла. Метод eof возвращает нулевое значение, если конец файла не достигнут, и ненулевое, если достигнут (когда читаем элемент за последним).

При возникновении какой-либо ошибочной ситуации с файлом (например, нет свободного места на диске), потоковый объект принимает значение, равное нулю. Во время работы рекомендуется контролировать значение потоковой переменной.

Пример 13.1. Построчное чтение файла и вывод его на экран

С помощью стандартного редактора Windows Блокнот создайте текстовый файл, состоящий из нескольких строк. В приведенном примере файл сохранен в папке Файлы на диске H под именем data.txt. Выведем содержимое этого файла на экран.

Для считывания информации из файла используется метод getline. Информация читается порциями по 80 символов (или меньше до символа перехода на новую строку \n), которые помещаются в переменную buf. Символ \n удаляется из потока, но в buf не помещается. К получившейся в buf строке дописывается нулевой символ. Затем значение переменной buf выводится на экран.

Если файл открыть не удалось (неверно задан путь к файлу), то функция exit завершает выполнение программы на C++. В аргументе указывается код завершения программы.

Пример 13.2. Чтение чисел из файла и запись их в файл

Пусть у нас имеется текстовый файл Числа.txt, в котором записаны целые числа. В одной строке числа разделяются запятыми. Количество чисел в строке, как и количество строк, может быть любым. Требуется переписать положительные числа в новый файл Результат.txt.

Ниже приведены два решения этой задачи. В первом варианте мы считываем из файла целиком строку, а затем с помощью строковых функций выделяем из этой строки числа. Функция atoi игнорирует пробелы и табуляцию в начале строки и преобразует в целое число часть строки до первого недопустимого символа или конца строки. Если строку нельзя преобразовать в число, возвращается ноль. Функция strchr возвращает указатель на первое вхождение заданного символа, в нашем случае – запятой, в строке.

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

Пример 13.3. Чтение символов из заданной позиции файла

Метод seekg изменяет позицию считывания в потоке ввода. Если он вызывается с одним аргументом, то этот аргумент определяет абсолютную позицию в потоке (позиции нумеруются с нуля). Если метод вызывается с двумя аргументами, то первый аргумент определяет сдвиг относительно позиции, заданной вторым аргументом (текущая позиция, начало файла, конец файла).

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

Пример 13.4. Работа с двоичным файлом. Сохранение структуры в файле

Для сохранения информации в файле в двоичном представлении нужно открыть файл в режиме binary. Для записи в файл используется метод write, для считывания – метод read. В файле могут храниться данные любого типа, в том числе объекты, но значение первого аргумента методов read и write всегда должно быть приведено к типу char *. Второй аргумент методов содержит размер данных в байтах. Чтобы не ошибиться, для вычисления размера используйте операцию sizeof.

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

 

Задания для самостоятельной работы

1. Создать в текстовом редакторе файл, содержащий несколько строк. Определить максимальный и минимальный размер строки в файле и вывести их в другой файл.

2. Дан текстовый файл. Выведите в выходной файл длину наибольшей строки и все строки такой длины.

3. Составьте программу, копирующую содержимое данного файла побайтно в обратном порядке.

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

5. Даны два файла вещественных чисел, в которых данные отсортированы по неубыванию. Каждая строка содержит одно число. Сформируйте новый файл из чисел входных файлов, чтобы его значения были также отсортированы по неубыванию.

6. Даны два текстовых файла. Сформируйте новый файл, вставив в первый файл содержимое второго файла с указанной позиции. Если вставка невозможна, выдайте об этом сообщение.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал