Цель лекции: изучить использование алгоритмов обработки элементов файла в решении задач и научится приемам решения задач на обработку элементов файла на языке C++.
Потоки для работы с файлами создаются как объекты следующих классов:
ofstream – для вывода (записи) данных в файл;
ifstream – для ввода (
fstream – для чтения и для записи данных (
Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл fstream.h. После этого в программе можно определять конкретные файловые потоки, соответствующих типов.
Создание файлового , то и ostream (класс ofstream ), istream (класс ifstream ), (класс fstream ), они поддерживают описанный в предыдущих шагах форматированный и бесформатный обмен с файлами. Однако прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.
Большинство средств управления потоковым вводом-выводом сосредоточены в классе , который является базовым для ostream и istream. По сути здесь находится управление связью между istream или ostream и буфером, используемым для контролирует работу буфера обмена: как символы заносятся и как они считываются.
Обеспечивает общие операции для ввода и вывода. Производные от него классы ( istream, ostream, iostream ) специализируют ввод-вывод с помощью операций форматирования высокого уровня. Класс является базовым для istream, ostream, fstreambase и strstreambase.
Флаги форматирования – двоичные коды, управляющие форматом выводимых значений. В iostream.h определено следующее перечисление, задающее флаги форматирования.
skipws |
0х0001 |
Пропускает при вводе пробелы и разделители. |
left |
0х0002 |
Выравнивание вывода влево. |
right |
0х0004 |
Выравнивание вывода вправо. |
internal |
0х0008 |
Дополнение после знака или указателя основания. |
|
0х0010 |
Десятичное преобразование. |
oct |
0х0020 |
Восьмеричное преобразование. |
|
0х0040 |
Шестнадцатеричное преобразование. |
showbase |
0х0080 |
Показывает в выводе индикатор основания. |
showpoint |
0х0100 |
Показывает при выводе с плавающей точкой десятичную точку. |
|
0х0200 |
Преобразует шестнадцатеричный вывод в верхний регистр. |
showpos |
0х0400 |
Выводит с положительными числами символ '+'. |
|
0х0800 |
Добавляет к числам с плавающей точкой |
fixed |
0х1000 |
Для вывода чисел с плавающей точкой использует десятичную фиксированную точку. |
unitbuf |
0х2000 |
После включения выводит все потоки. |
stdio |
0х4000 |
После включения выводит stdout и stderr. |
Фактически в этом списке содержатся имена констант, определяющие флаги соответствующих назначений. Коду формата соответствует long. Изменить состояние флагов формата можно с помощью функции класса , имеющей прототип
long setf(long flags);
Например, чтобы установить флаг showbase в активный режим (включить) применительно к cout, используется оператор
cout.setf(ios::showbase);
Для установки флагов можно использовать побитовые операции. Например:
cout.setf(ios::left|ios::hex);
В результате включатся одновременно флаги, управляющие выравниванием по левому краю и выводом целых значений в шестнадцатеричной системе.
| Функция | Прототип | Описание |
|---|---|---|
|
int |
Ненулевое значение в случае ошибки. |
bitalloc |
static long bitalloc(); |
Получает новый флаг битового набора. |
|
int |
В случае достижения конца файла возвращает ненулевое значение. |
|
int |
Не 0 при неуспешном выполнении операции с потоком. |
fill |
char fill(); |
Возвращает текущий символ-заполнитель потока. |
char fill(char); |
Заменяет значением параметра символ заполнения потока; возвращает ранее установленное значение символа заполнения. | |
|
long |
Возвращает текущее значение флагов форматирования. |
long |
Устанавливает флаги форматирования по значению параметра; возвращает ранее установленное значение флагов. | |
good |
int good(); |
Возвращает ненулевое значение, если не установлен ни один флаг (ошибок нет). |
presicion |
int presicion(); |
Возвращает текущую точность числа с плавающей точкой. |
int presicion(int); |
Устанавливает точность вещественных чисел с плавающее точкой по значению параметра; Возвращает предыдущее значение параметра. | |
rdbuf |
streambuf* rdbuf(); |
Возвращает указатель на streambuf, назначенный для данного потока. |
rdstate |
int rdstate(); |
Возвращает текущее состояние потока. |
setf |
long setf(long); |
Устанавливает флаги по значению параметра; возвращает ранее установленные флаги. |
sync_with_stdio |
sync_with_stdio; |
Смешивает файлы stdio и потоки iostreams. В новой программе этого использовать не следует. |
unseft |
long unseft(long); |
Очищает биты состояния потока, отмеченные параметром; возвращает предыдущее состояние битов. |
with |
int with(); |
Возвращает текущее значение ширины. |
int with(int); |
Устанавливает ширину, равную параметру; возвращает предыдущее значение параметра. | |
gcount |
int gcount(); |
Возвращает число символов, извлеченных из потока последним обращением. |
get |
int get(); |
Получает следующий символ либо |
int get( |
Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача завершается, если число принятых символов на 1 меньше второго параметра или встретился символ '\n'. |
|
getline |
iostream getline( |
Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача завершается, если число принятых символов на 1 меньше второго параметра или встретился символ '\n',который помещается в строку. |
|
iostream |
Пропускает n символов в потоке. При обнаружении delim останавливается (по умолчанию, delim= ). |
|
int |
Возвращает следующий символ без извлечения из потока. |
putback |
iostream putback(char); |
Помещает символ обратно в поток. |
read |
read( |
Извлекает из потока и помещает в |
seekg |
iostream seekg(long); |
Перемещает заданное число байт относительно текущей позиции для потока ввода. Можно задавать направление. |
telig |
Long telig(); |
Возвращает текущую |
|
ostream |
Флэширует внутренний буфер выходного потока. |
put |
ostream put(char); |
Помещает заданный параметром char символ в выходной поток. |
seekp |
ostream seekp (long); |
Устанавливает указатель записи выходного потока на абсолютную позицию, заданную параметром long. |
ostream seekp (long, seek_dir); |
Перемещает |
|
tellp |
long tellp(); |
Возвращает текущую позицию выходного потока. |
write |
ostream write (const |
Помещает в выходной поток n символов из массива, на который указывает char *. |
ostream write (const |
Пример 1. Входной файл содержит следующую информацию: в первой строке
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <fstream>
int _tmain(int argc, _TCHAR* argv[]){
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 << "Запись в файл завершена";
}
system("pause");
return 0;
}
Пример 2. Дан текстовый файл. Выведите в выходной файл длину наибольшей строки и все строки такой длины.
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <fstream>
#include <string.h>
int _tmain(int argc, _TCHAR* argv[]){
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 << "Запись в файл завершена";
}
system("pause");
return 0;
}
Извлечение из потока – это процесс чтения данных из потока.
Класс fstream – это поток для чтения и для записи данных (
Класс ifstream – это поток для ввода (
Класс –
Класс ofstream – это поток для вывода (записи) данных в файл.
Помещение или включение в поток – это процесс вывода данных в поток.
Поток – это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику.
Флаги форматирования – двоичные коды, управляющие форматом выводимых значений.
ofstream, ifstream, fstream наследуются из базового класса ios .ios контролирует работу буфера обмена.Цель работы: изучить использование алгоритмов обработки элементов файла в решении задач и научится приемам решения задач на обработку элементов файла на языке C++.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе строковые величины, являющиеся корректными именами входных и выходных файлов (при этом в программе следует предусмотреть проверку существования и корректности открытия используемых файлов). Ввод данных осуществляется из входных файлов с учетом требований к
Теоретические сведения.
Ознакомьтесь с материалом лекции 23.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
in.dat числами по закономерности: 1/2, 1/4, 2/6, 3/8, 5/16,… Считывая данные из in.dat , заполните файл out.dat квадратами чисел, попавших в [a, b].k символов ch.N вещественных чисел. Найти наибольшее из значений модулей компонентов с нечетными номерами. Выведите результат на экран и в файл.Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами и алгоритмами обработки файлов в языке С++. В программном коде к каждой задаче следует выполнять
Следует реализовать каждое
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
ofstream, ifstream, fstream?get без параметров и с тремя параметрами?flags без параметров и с параметром?Цель лекции: изучить использование алгоритмов обработки элементов файла в решении задач и научится приемам решения задач на обработку элементов файла на языке C++.
Потоки для работы с файлами создаются как объекты следующих классов:
ofstream – для вывода (записи) данных в файл;
ifstream – для ввода (
fstream – для чтения и для записи данных (
Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл fstream.h. После этого в программе можно определять конкретные файловые потоки, соответствующих типов.
Создание файлового , то и ostream (класс ofstream ), istream (класс ifstream ), (класс fstream ), они поддерживают описанный в предыдущих шагах форматированный и бесформатный обмен с файлами. Однако прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.
Большинство средств управления потоковым вводом-выводом сосредоточены в классе , который является базовым для ostream и istream. По сути здесь находится управление связью между istream или ostream и буфером, используемым для контролирует работу буфера обмена: как символы заносятся и как они считываются.
Обеспечивает общие операции для ввода и вывода. Производные от него классы ( istream, ostream, iostream ) специализируют ввод-вывод с помощью операций форматирования высокого уровня. Класс является базовым для istream, ostream, fstreambase и strstreambase.
Флаги форматирования – двоичные коды, управляющие форматом выводимых значений. В iostream.h определено следующее перечисление, задающее флаги форматирования.
skipws |
0х0001 |
Пропускает при вводе пробелы и разделители. |
left |
0х0002 |
Выравнивание вывода влево. |
right |
0х0004 |
Выравнивание вывода вправо. |
internal |
0х0008 |
Дополнение после знака или указателя основания. |
|
0х0010 |
Десятичное преобразование. |
oct |
0х0020 |
Восьмеричное преобразование. |
|
0х0040 |
Шестнадцатеричное преобразование. |
showbase |
0х0080 |
Показывает в выводе индикатор основания. |
showpoint |
0х0100 |
Показывает при выводе с плавающей точкой десятичную точку. |
|
0х0200 |
Преобразует шестнадцатеричный вывод в верхний регистр. |
showpos |
0х0400 |
Выводит с положительными числами символ '+'. |
|
0х0800 |
Добавляет к числам с плавающей точкой |
fixed |
0х1000 |
Для вывода чисел с плавающей точкой использует десятичную фиксированную точку. |
unitbuf |
0х2000 |
После включения выводит все потоки. |
stdio |
0х4000 |
После включения выводит stdout и stderr. |
Фактически в этом списке содержатся имена констант, определяющие флаги соответствующих назначений. Коду формата соответствует long. Изменить состояние флагов формата можно с помощью функции класса , имеющей прототип
long setf(long flags);
Например, чтобы установить флаг showbase в активный режим (включить) применительно к cout, используется оператор
cout.setf(ios::showbase);
Для установки флагов можно использовать побитовые операции. Например:
cout.setf(ios::left|ios::hex);
В результате включатся одновременно флаги, управляющие выравниванием по левому краю и выводом целых значений в шестнадцатеричной системе.
| Функция | Прототип | Описание |
|---|---|---|
|
int |
Ненулевое значение в случае ошибки. |
bitalloc |
static long bitalloc(); |
Получает новый флаг битового набора. |
|
int |
В случае достижения конца файла возвращает ненулевое значение. |
|
int |
Не 0 при неуспешном выполнении операции с потоком. |
fill |
char fill(); |
Возвращает текущий символ-заполнитель потока. |
char fill(char); |
Заменяет значением параметра символ заполнения потока; возвращает ранее установленное значение символа заполнения. | |
|
long |
Возвращает текущее значение флагов форматирования. |
long |
Устанавливает флаги форматирования по значению параметра; возвращает ранее установленное значение флагов. | |
good |
int good(); |
Возвращает ненулевое значение, если не установлен ни один флаг (ошибок нет). |
presicion |
int presicion(); |
Возвращает текущую точность числа с плавающей точкой. |
int presicion(int); |
Устанавливает точность вещественных чисел с плавающее точкой по значению параметра; Возвращает предыдущее значение параметра. | |
rdbuf |
streambuf* rdbuf(); |
Возвращает указатель на streambuf, назначенный для данного потока. |
rdstate |
int rdstate(); |
Возвращает текущее состояние потока. |
setf |
long setf(long); |
Устанавливает флаги по значению параметра; возвращает ранее установленные флаги. |
sync_with_stdio |
sync_with_stdio; |
Смешивает файлы stdio и потоки iostreams. В новой программе этого использовать не следует. |
unseft |
long unseft(long); |
Очищает биты состояния потока, отмеченные параметром; возвращает предыдущее состояние битов. |
with |
int with(); |
Возвращает текущее значение ширины. |
int with(int); |
Устанавливает ширину, равную параметру; возвращает предыдущее значение параметра. | |
gcount |
int gcount(); |
Возвращает число символов, извлеченных из потока последним обращением. |
get |
int get(); |
Получает следующий символ либо |
int get( |
Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача завершается, если число принятых символов на 1 меньше второго параметра или встретился символ '\n'. |
|
getline |
iostream getline( |
Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача завершается, если число принятых символов на 1 меньше второго параметра или встретился символ '\n',который помещается в строку. |
|
iostream |
Пропускает n символов в потоке. При обнаружении delim останавливается (по умолчанию, delim= ). |
|
int |
Возвращает следующий символ без извлечения из потока. |
putback |
iostream putback(char); |
Помещает символ обратно в поток. |
read |
read( |
Извлекает из потока и помещает в |
seekg |
iostream seekg(long); |
Перемещает заданное число байт относительно текущей позиции для потока ввода. Можно задавать направление. |
telig |
Long telig(); |
Возвращает текущую |
|
ostream |
Флэширует внутренний буфер выходного потока. |
put |
ostream put(char); |
Помещает заданный параметром char символ в выходной поток. |
seekp |
ostream seekp (long); |
Устанавливает указатель записи выходного потока на абсолютную позицию, заданную параметром long. |
ostream seekp (long, seek_dir); |
Перемещает |
|
tellp |
long tellp(); |
Возвращает текущую позицию выходного потока. |
write |
ostream write (const |
Помещает в выходной поток n символов из массива, на который указывает char *. |
ostream write (const |
Пример 1. Входной файл содержит следующую информацию: в первой строке
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <fstream>
int _tmain(int argc, _TCHAR* argv[]){
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 << "Запись в файл завершена";
}
system("pause");
return 0;
}
Пример 2. Дан текстовый файл. Выведите в выходной файл длину наибольшей строки и все строки такой длины.
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <fstream>
#include <string.h>
int _tmain(int argc, _TCHAR* argv[]){
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 << "Запись в файл завершена";
}
system("pause");
return 0;
}
Извлечение из потока – это процесс чтения данных из потока.
Класс fstream – это поток для чтения и для записи данных (
Класс ifstream – это поток для ввода (
Класс –
Класс ofstream – это поток для вывода (записи) данных в файл.
Помещение или включение в поток – это процесс вывода данных в поток.
Поток – это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику.
Флаги форматирования – двоичные коды, управляющие форматом выводимых значений.
ofstream, ifstream, fstream наследуются из базового класса ios .ios контролирует работу буфера обмена.Цель работы: изучить использование алгоритмов обработки элементов файла в решении задач и научится приемам решения задач на обработку элементов файла на языке C++.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе строковые величины, являющиеся корректными именами входных и выходных файлов (при этом в программе следует предусмотреть проверку существования и корректности открытия используемых файлов). Ввод данных осуществляется из входных файлов с учетом требований к
Теоретические сведения.
Ознакомьтесь с материалом лекции 23.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
in.dat числами по закономерности: 1/2, 1/4, 2/6, 3/8, 5/16,… Считывая данные из in.dat , заполните файл out.dat квадратами чисел, попавших в [a, b].k символов ch.N вещественных чисел. Найти наибольшее из значений модулей компонентов с нечетными номерами. Выведите результат на экран и в файл.Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами и алгоритмами обработки файлов в языке С++. В программном коде к каждой задаче следует выполнять
Следует реализовать каждое
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
Контрольные вопросы
ofstream, ifstream, fstream?get без параметров и с тремя параметрами?flags без параметров и с параметром?Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.