- •1 Задание
- •2 Требования к реализации
- •3 Методические указания
- •3.1 Файловые потоки ввода-вывода
- •1) Открытие потока
- •2) Закрытие потока
- •3) Ввод/вывод в поток
- •4) Функции позиционирования
- •3.2 Работа со строками
- •Функции работы со строками
- •1) Определение длины строк
- •2) Обращение строк
- •3) Поиск символов
- •3) Поиск подстрок
- •2) Копирование строк
1 Задание
Дан текстовый файл, содержащий несколько строк. Каждая строка состоит из слов, разделенных пробелом.
Надо:
- найти строку со словами, содержащими все символы заданной подстроки. Сформировать из таких слов новую строку;
- если хотя бы одно слово в строке содержит заданную подстроку, то переместить первое найденное слово в начало строки;
- если строка не содержит искомых слов, то выполнить ее отражение.
В выходной файл записать новые преобразованные строки.
2 Требования к реализации
В программе должны быть реализованы две функции:
- функция для ввода данных в массив символов из файла с анализом результата работы с файлом;
- функция для обработки каждой строки в соответствии с заданием, возвращающая истину, если строка содержит искомые слова.
3 Методические указания
3.1 Файловые потоки ввода-вывода
Потоком называется последовательность байтов, передаваемая между объектами. На этом уровне понятие типа данных отсутствует.
В языке С++ управление потоками осуществляется следующими способами:
- с помощью функций библиотеки ввода/вывода, унаследованной от С и объявленной в заголовочном файле stdio.h или cstdio,
-с помощью операторов потока ввода/вывода.
К преимуществам первого способа относится возможность более гибкого управления форматированием и его полная совместимость с С. Используя операторы потока ввода/вывода, можно не задумываться о форматах вывода информации, если это не имеет принципиального значения. Кроме того, этот метод позволяет переопределить форму вывода для любого класса. Однако, одновременное использование библиотеки stdio.h и операторов потока ввода/вывода не желательно. Если без этого обойтись нельзя, то необходимо вызвать функцию sync_with_stdio().
На пользовательском уровне информацию из потока необходимо преобразовать к различным типам данных. Это так же осуществляется с помощью функций библиотеки stdio.h или с помощью операторов потока ввода/вывода.
Если символы потока в совокупности образуют символьный массив ( строку ) в основной памяти, то это строковый поток. Если при использовании потока его символы размещены на внешнем носителе данных (диске), то говорят о файловом потоке или просто файле.
Операции с потоками при использовании библиотеки stdio.h.
Файловый ввод/вывод при использовании библиотеки stdio.h. состоит из трех основных шагов:
-открытие потока;
-ввод/вывод в поток;
-закрытие потока.
1) Открытие потока
Открытие потока включает следующие операции:
1. Объявление указателей на файловые потоки:
FILE *fp1,*fp2;
2. Открытие файла и связывание его с указателем потока с помощью функции fopen:
f1=fopen(d:\\mydir\\myfile, w);
Эти операции можно объединить в одну:
FILE *fp1=fopen(d:\\mydir\\myfile, w);
Здесь первый параметр, строка – имя файла. Если имя файла включает имена папок, в которых он находится, то они отделяются двойным обратным слэшем \\.
Второй параметр, строка – задает режим, в котором открывается файл:
"г" — файл открывается для чтения;
"w" — открывается пустой файл для записи (если файл существует, он стирается);
"а" — файл открывается для добавления информации в его конец;
"г+" — файл открывается для чтения и записи (файл должен существовать);
"w+" — открывается пустой файл для чтения и записи (если файл существует, он стирается);
"а+" — файл открывается для чтения и добавления информации в его конец.
Режим открытия может также содержать символы t (текстовый режим) или b (двоичный режим), отличающиеся обработкой символов перехода на новую строку. По умолчанию файл открывается в текстовом режиме, при котором комбинация символов «возврат каретки» и «перевод строки» (0x13 и 0x10) при вводе преобразуются в одиночный символ перевода строки (при выводе выполняется обратное преобразование). В двоичном режиме эти преобразования не выполняются.
Пример:
FILE *f = fopen("d:\\cpp\\data", "rb+");
Открывается поток f связанный с двоичным файлом d:\\cpp\\data для чтения и записи
3. Проверка правильности открытия потока
При успешном открытии потока функция возвращает указатель f на предопределенную структуру типа FILE, содержащую всю необходимую для работы с потоком информацию, или NULL в противном случае. Поэтому в программу обязательно добавляется код проверки правильности открытия потока, чтобы не было зависания компьютера:
FILE *f, *fo;
1f((f = fopen("d:\\c\\file.txt", "r")) == 0)
{cout << "Ошибка открытия входного файла"; return 1;}
В этом примере при неудачном открытии потока произойдет завершение выполнения функции, в которой открывается поток. Функция возвратит значение 1 с помощью оператора return 1;
Указатель f используется в дальнейших операциях с потоком. Его передают функциям ввода/вывода в качестве параметра.
При открытии потока с ним связывается область памяти, называемая буфером. При выводе вся информация направляется в буфер и накапливается там до заполнения буфера или до закрытия потока. Чтение осуществляется блоками, равными размеру буфера, и данные читаются из буфера. Буферизация позволяет более быстро и эффективно обмениваться информацией с внешними устройствами. Следует иметь в виду, что при аварийном завершении программы выходной буфер может быть не выгружен, и возможна потеря данных. С помощью функций setbuf и setvbuf можно управлять размерами и наличием буферов.
Существует пять предопределенных потоков, которые открываются в начале работы программы: стандартный ввод stdin(связан с клавиатурой), стандартный вывод stdout(связан с дисплеем), стандартный вывод сообщений об ошибках stderr(связан с дисплеем), стандартный дополнительный поток stdaux и стандартная печать stdprn. Эти указатели можно использовать в любой функции ввода/вывода там, где требуется указатель потока.