Теоретические сведения. Потоки для работы с файлами создаются как объекты следующих классов:
Потоки для работы с файлами создаются как объекты следующих классов:
ofstream – для вывода (записи) данных в файл;
ifstream – для ввода (чтения) данных из файла;
fstream – для чтения и для записи данных (двунаправленный обмен).
Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл fstream.h. После этого в программе можно определять конкретные файловые потоки, соответствующих типов.
Создание файлового потока (объекта соответствующего класса) связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Так как перечисленные классы файловых потоков наследуют свойства класса ios, то и переменные состояния каждого файлового потока наследуются из этого базового класса. Файловые классы являются производными от классов ostream (класс ofstream), istream (класс ifstream), stream (класс fstream), они поддерживают описанный в предыдущих шагах форматированный и бесформатный обмен с файлами. Однако прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.
Открытие файла в самом общем смысле означает процедуру, информирующую систему о тех действиях, которые предполагается выполнять с файлом. Работая с файловыми потоками с помощью библиотек ввода-вывода языка С++, удобнее пользоваться компонентными функциями соответствующих классов.
Большинство средств управления потоковым вводом-выводом сосредоточены в классе ios, который является базовым для ostream и istream. По сути здесь находится управление связью между istream или ostream и буфером, используемым для операций ввода-вывода. Именно класс ios контролирует работу буфера обмена: как символы заносятся и как они считываются.
Класс ios (iostream.h)
Обеспечивает общие операции для ввода и вывода. Производные от него классы (istream, ostream, iostream) специализируют ввод-вывод с помощью операций форматирования высокого уровня. Класс ios является базовым для istream, ostream, fstreambase и strstreambase.
Флаги форматирования – воичные коды, управляющие форматом выводимых значений. В заголовочном файле iostream.h определено следующее перечисление, задающее флаги форматирования.
Значения флагов форматирования файлаiostream.h
Флаг | Значение флага | Описание |
skipws | 0х0001 | Пропускает при вводе пробелы и разделители. |
left | 0х0002 | Выравнивание вывода влево. |
right | 0х0004 | Выравнивание вывода влево. |
internal | 0х0008 | Дополнение после знака или указателя основания. |
dec | 0х0010 | Десятичное преобразование. |
oct | 0х0020 | Восьмеричное преобразование. |
hex | 0х0040 | Шестнадцатеричное преобразование. |
showbase | 0х0080 | Показывает в выводе индикатор основания. |
showpoint | 0х0100 | Показывает при выводе с плавающей точкой десятичную точку. |
uppercase | 0х0200 | Преобразует шестнадцатеричный вывод в верхний регистр. |
showpos | 0х0400 | Выводит с положительными числами символ '+'. |
scientific | 0х0800 | Добавляет к числам с плавающей точкой суффикс с показателем степени (E). |
fixed | 0х1000 | Для вывода чисел с плавающей точкой использует десятичную фиксированную точку. |
unitbuf | 0х2000 | После включения выводит все потоки. |
stdio | 0х4000 | После включения выводит stdout и stderr. |
Фактически в этом списке содержатся имена констант, определяющие флаги соответствующих назначений. Коду формата соответствует целый тип long. Изменить состояние флагов формата можно с помощью функции класса ios, имеющей прототип
long setf(long flags);
Например, чтобы установить флаг showbase в активный режим (включить) применительно к стандартному потоку вывода cout, используется оператор
cout.setf(ios::showbase);
Для установки флагов можно использовать побитовые операции.
Например:
cout.setf(ios::left|ios::hex);
В результате включатся одновременно флаги, управляющие выравниванием по левому краю и выводом целых значений в шестнадцатеричной системе.
Функции класса ios |
|
Функции класса istream |
|
Функции класса ostream |
|
Пример 1. Входной файл содержит следующую информацию: в первой строке натуральное число указывает количество чисел, далее следуют вещественные числа. Выведите в выходной файл только положительные числа из входного файла и их сумму.
#include <iostream.h>
#include <fstream.h >
void main(){
int n,i=1;
float s, sum=0.0;
// Открываем входной файл для ввода данных
ifstream infile("in.txt");
// Открываем выходной файл для вывода данных
ofstream outfile("out.txt");
// Проверка корректности открытия входного файла
if (!infile) {
cout << "Файл не открыт.\n";}
else {
infile >> n; //Считываем количество чисел
while (i++<=n){
infile >> s; //Считываем вещественные числа
if (s>0) {
sum+=s;
outfile << s <<"\n";
//Выводим положительные числа
}
}
outfile << sum; //Выводим сумму в выходной файл
// Закрываем файлы
infile.close();
outfile.close();
cout << "Запись в файл завершена";
}
}
Пример 2. Дан текстовый файл. Выведите в выходной файл длину наибольшей строки и все строки такой длины.
#include <iostream.h>
#include <fstream.h>
#include <string.h>
void main(){
int maxlen=0, len;
char st[200],delim;
//Связываем переменные с потоками
ifstream infile;
ofstream outfile;
// Открываем входной файл для ввода данных
infile.open("in.txt");
// Проверка корректности открытия входного файла
if (!infile) {
cout << "Файл не открыт.\n";}
else {
//Поиск максимальной длины строк
while (!infile.eof()) {
infile.getline(st,200,delim='\n');
len=strlen(st);
if (len>maxlen)
maxlen=len;
}
// Закрываем входной файл
infile.close();
}
// Открываем входной файл для ввода данных
infile.open("in.txt");
// Открываем выходной файл для вывода данных
outfile.open("out.txt");
// Проверка корректности открытия входного файла
if (!infile) {
cout << "Файл не открыт.\n";}
else {
outfile<<"Длина наибольшей строки равна "<<maxlen<<"\n";
//Поиск и вывод строк максимальной длины
while (!infile.eof()) {
infile.getline(st,200,delim='\n');
len=strlen(st);
if (len==maxlen)
outfile <<st<<"\n";
}
// Закрываем файлы
infile.close();
outfile.close();
cout << "Запись в файл завершена";
}
}
Задания
1.Наберите код программы из Примера 1. Выполните компиляцию и запуск программы.
2.Заполните файл in.dat числами по закономерности: 1/2, 1/4, 2/6, 3/8, 5/16,… Считывая данные из in.dat, заполните файл out.dat квадратами чисел, попавших в отрезок [a, b].
3.Дан входной текстовый файл. Заполните выходной файл только теми строками, в которых ровно k символов ch.
Домашние задания
1.Наберите код программы из Примера 2. Выполните компиляцию и запуск программы.
2.Даны два входных текстовых файла. Сформируйте выходной файл из строк, полученных конкатенацией соответствующих по порядку строк входных файлов. Если один из входных файлов закончится раньше, то оставшиеся строки второго файла допишите без изменения.
3. Индивидуальное задание. Номер варианта определяется по журналу. Организуйте работу с файлом. Использование массива не предусматривается.
Варианты индивидуального задания
№ | Задание |
1. | Организовать файл целых чисел из N компонент. Определить сумму компонент файла имеющих нечётные индексы. Результат вывести в этот же файл. |
2. | Создайте файл целых чисел, занося в него числа Фибоначчи, не превосходящие заданного числа N и количество таких чисел. |
3. | Заполнить файл f целыми числами, полученными с помощью генератора случайных чисел. Из файла f получить файл g, исключив повторные вхождения чисел. Порядок следования чисел сохранить. |
4. | Записать в файл п элементов последовательности . Вывести на печать те компоненты файла, для которых выполняется условие , где — заданное число. |
5. | Организовать файл целых чисел из N компонент. Определить и вывести на экран и в этот же файл максимальное число в файле. |
6. | В файл f записать N целых чисел, полученных с помощью генератора случайных чисел. Заполнить файл g числами, которые являются произведениями соседних компонентов файла f. |
7. | Организовать файл целых чисел из N компонент. Удалить из файла все отрицательные компоненты. Вывести содержимое файла до обработки, и после обработки. |
8. | Организовать файл целых чисел, состоящий из N компонент, заменить все элементы файла из отрезка [-10; 10] на противоположные. Вывести содержимое файла до и после обработки. |
9. | Дан файл, содержащий различные даты. Каждая дата – это число, месяц и год в формате «dd.mm.yyyy». Найти: 1) год с наименьшим номером; 2) самую позднюю дату. |
10. | Организовать файл целых чисел из N компонент. Все числа, кратные 3 заменить их удвоенным произведением. Вывести содержимое файла до и после обработки. |
11. | Сформируйте файл целых чисел. Выведите на экран и в файл k-й элемент этого файла (элементы нумеруются от 0). Если файл не существует или не содержит k-го элемента, то выведите об этом сообщение. |
12. | Напечатать содержимое данного файла, каждая строка которого есть число, если размер существующего файла неизвестен. Выведите в этот же файл количество чисел в нем. |
13. | Организовать файл вещественных чисел из N компонент. Заменить все положительные компоненты файла их квадратными корнями, а все отрицательные компоненты их квадратами. Вывести содержимое файла до обработки и после обработки. |
14. | Замените порядок следования целочисленных элементов файла на противоположный. Вывести содержимое файла до обработки и после обработки. |
15. | В файле целых чисел заменить все четные натуральные числа их квадратами. Вывести содержимое файла до обработки и после обработки. |
16. | Записать в файл N вещественных чисел. Вычислить произведение компонентов файла и вывести в этот же файл и на печать. |
17. | Записать в файл N различныхцелых чисел, полученных с помощью генератора случайных чисел. Подсчитать количество пар противоположных чисел среди компонентов этого файла. Выведите найденное количество на экран и в этот же файл. |
18. | Каждая строка файла содержит отдельное слово. Выведите в файл рядом со словом его длину. Размер существующего файла неизвестен. |
19. | Заполнить файл N вещественными числами, полученными с помощью датчика случайных чисел. Найти сумму минимального и максимального элементов этого файла. Выведите результат на экран и в этот же файл. |
20. | Заполнить файл натуральными числами, полученными с помощью генератора случайных чисел. Найти количество квадратов нечетных чисел среди компонентов. Выведите результат на экран и в этот же файл. |
21. | Записать в файл N вещественных чисел. Найти наибольшее из значений модулей компонентов с нечетными номерами. Выведите результат на экран и в этот же файл. |
22. | Записать в файл N вещественных чисел. Найти разность первого и последнего компонентов файла. Выведите результат на экран и в этот же файл. |
23. | Записать в файл п вещественных чисел а1, а2, … аn.Организовать новый файл, элементы которого вычисляются по формуле . Вывести полученный файл на печать. |
24. | Заполнить файл N вещественными числами, полученными с помощью датчика случайных чисел. Введите два натуральных числа a и b. Найдите сумму компонент данного файла с номерами от a до b включительно (нумерация начинается с 0). Если элементов с данными номерами найти невозможно, выдайте сообщение на экран и в файл. |
25. | Пусть дан файл целых чисел. Определите, являются ли числа в файле упорядоченными по возрастанию. |
26. | Пусть дан файл, хранящий последовательность целых чисел. Определите, являются ли последовательность знакопеременной. |
27. | В файл f записать N целых чисел, полученных с помощью генератора случайных чисел. Заполнить файл g числами, которые получаются из компонентов файла f по закономерности: один первый элемент, сумма двух первых, сумма трех первых и так далее. |
28. | Заполнить файл N вещественными числами, полученными с помощью датчика случайных чисел. Найти наименьшую разницу между соседними элементами этого файла. Выведите результат на экран и в этот же файл. |
Дата добавления: 2015-02-16; просмотров: 1228;