Теоретические сведения. Потоки для работы с файлами создаются как объекты следующих классов:

Потоки для работы с файлами создаются как объекты следующих классов:

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
Описание Ненулевое значение в случае ошибки. Получает новый флаг битового набора. Возвращаемое значение может использовать для установки, очистки и проверки флаги. Это флаги форматирования, определяемые пользователем. В случае достижения конца файла возвращает ненулевое значение. Не 0 при неуспешном выполнении операции с потоком. Возвращает текущий символ-заполнитель потока. Заменяет значением параметра символ заполнения потока; возвращает ранее установ­ленное значение символа заполнения. Возвращает текущее значение флагов форматирования. Устанавливает флаги форматирования по значению параметра; возвращает ранее ус­тановленное значение флагов. Возвращает ненулевое значение, если не установлен ни один флаг (ошибок нет). Возвращает текущую точность числа с плавающей точкой. Устанавливает точность вещественных чисел с плавающее точкой по значению пара­метра; Возвращает предыдущее значение параметра. Возвращает указатель на streambuf, назначенный для данного потока. Возвращает текущее состояние потока. Устанавливает флаги по значению параметра; возвращает ранее установленные флаги. Смешивает файлы stdio и потоки iostreams. В новой программе этого использо­вать не следует. Очищает биты состояния потока, отмеченные параметром; возвращает предыдущее состояние битов. Возвращает текущее значение ширины. Устанавливает ширину, равную параметру; возвращает предыдущее значение пара­метра.
Прототип int bad(); static long bitalloc(); int eof(); int fail(); char fill(); char fill(char); long flags(); long flags(long); int good(); int presicion(); int presicion(int); streambuf* rdbuf(); int rdstate(); long setf(long); sync_with_stdio; long unseft(long); int with(); int with(int);
Функция bad bitalloc eof fail fill flags good presicion rdbuf rdstate setf sync_with_stdio unseft with

 


 

Функции класса istream
Описание Возвращает число символов, извлеченных из потока по­следним обращением. Получает следующий символ либо EOF, сохраняя их в бу­фере. Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача за­вершается, если число принятых символов на 1 меньше второго параметра или встретился символ ’\n’. Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача за­вершается, если число принятых символов на 1 меньше второго параметра или встретился символ ’\n’,который помещается в строку. Пропускает n символов в потоке. При обнаружении delim останавливается (по умолчанию, delim=EOF). Возвращает следующий символ без извлечения из потока. Помещает символ обратно в поток. Извлекает из потока и помещает в символьный массив ука­занное число символов. Перемещает заданное число байт относительно текущей по­зиции для потока ввода. Можно задавать направление. Возвращает текущую позицию курсора. В случае неуспеш­ного выполнения возвращает отрицательное число.
Прототип int gcount(); int get(); int get(signed char*, int, char=’\n’); iostream& getline(signed char*, int, char=’\n’); iostream& ignore(int n, int delim); int peek(); iostream& putback(char); read(signed char*, int); iostream& seekg(long); Long telig();
Функция gcount get getline ignore peek putback read seekg telig

 

  Функции класса ostream
Описание Флэширует внутренний буфер выходного потока. Помещает заданный параметром char символ в выходной поток. Устанавливает указатель записи выходного потока на абсо­лютную позицию, заданную параметром long. Перемещает указатель текущей позиции выходного потока на число байтов, заданное первым параметром. Второй па­раметр задает точку отсчета (0 – начало; 1 – текущая пози­ция; 2 – конец потока) Возвращает текущую позицию выходного потока. Помещает в выходной поток n символов из массива, на ко­торый указывает char *. Нуль-символы включаются в число переносимых символов.
Прототип ostream& flush(); ostream& put(char); ostream& seekp (long); ostream& seekp (long, seek_dir); long tellp(); ostream& write (const signed, char *, int n);   ostream& write (const signed, char *, int n);
Функция flush put seekp tellp write

Пример 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.035 сек.