Similar presentations:
Работа с файлами. Запись и считывание данных. Лекция 13
1. Работа с файлами
запись и считывание данных2. 1. Открытие и закрытие файла
Для выполнения операций ввода-вывода над файламинеобходимо включить в программу заголовок:
#include <fstream>
В C++ ввод-вывод осуществляется посредством логического
интерфейса, называемого потоком.
Потоки связываются с различными устройствами ввода-вывода,
но имеют один и тот же программный интерфейс.
Существуют три типа потоков:
• ввода ( класс ifstream ),
• вывода ( класс ofstream ) и
• ввода – вывода ( класс fstream ).
Пример создания потоков (имена потоков задаются программистом):
ifstream in;
// in
- поток ввода
ofstream out; // out - поток вывода
fstream both; // both - поток ввода-вывода
2
3.
Созданный поток необходимо связать с файломс помощью функции open( ).
Примеры:
in.open( "input.txt" );
out.open( "output.txt" );
both.open( "inout.txt" );
// для ввода
// для вывода
// для ввода-вывода
Можно совместить описание потоков с операцией связывания
с файлом (обычно так и записывают):
ifstream in( "input.txt" );
// для ввода
ofstream out( "output.txt" );
// для вывода
fstream both ("inout.txt" );
// для ввода-вывода
3
4.
Если функция open( ) завершилась неудачно, то поток имеетзначение false.
Поэтому можно проконтролировать успешность открытия
файла:
if( !inp )
cout << "Нет файла\n";
else
cout << "Файл открыт\n";
Для закрытия файла используется функция close( ).
inp.close( );
out.close( );
// закрытие файла
// закрытие файла
4
5. 2. Чтение и запись текстовых файлов
Простейшим способом чтения из текстового файла илизаписи в него является использование операторов
<< записи в поток и
>> чтения из потока.
Чтение из файла "input.txt"
Допустим, что в данном текстовом файле записаны: два
вещественных числа, символ, текстовая строка (без пробелов) и
целое число.
Они могут быть записаны последовательно друг за другом с
разделением пробелом, могут быть в разных строках (это не
имеет значения для считывания их)
1.23e-25
45.6
Z Строка 789
5
6.
Чтение данных из файла:#include <iostream>
1.23e-25
#include <fstream>
45.6
using namespace std;
Z Строка 789
int main( )
{
setlocale(0, "");// позволяет отображать русский шрифт на консоли
double q, p;
char ch ;
char str[20];
int i;
ifstream inp("Input.txt"); // открытие файла для чтения
if(!inp)
// проверка успешности открытия файла
{ cout << "Нет файла"; return 1;}
inp >> q >> p >> ch >> str >> i; // ввод информации из файла
inp.close( ); // закрытие файла
// вывод данных на экран для контроля
cout << " q=" << q << " p =" << p << " ch = " << ch
<< " str = " << str << " i = " << i <<endl;
return 0;
}
6
7.
Запись данных в файл:Модификатор ate сохраняет содержимое
файла, если он существует, и устанавливает
указатель в конец файла при открытии;
app - то же самое, с той лишь разницей, что
устанавливает указатель в конец файла перед
каждой записью в файл (т.е. записывать можно
только в конец файла).
#include <iostream>
#include <fstream>
using namespace std;
int main( )
{
setlocale(0, "");
double q = 1.23e-25, p = 45.6;
Дополнение информации в файл
// открытие файла для дополнения
char ch = 'Z' ;
ofstream out("output.txt", ios::app);
char str[20] = "Строка";
int i = 789;
ofstream out("output.txt"); // создание и открытие файла для записи
if(!out)
// проверка успешности открытия файла
{cout << "Нет файла"; return 1;}
out << q << '\n' << p << '\n' << ch << " " << str << " " << i; // запись данных в файл
out.close( ); // закрытие файла
return 0;
}
В результате в файл output.txt будет записано:
1.23e-025
45.6
Z Строка 789
7
8.
Чтение текста вместе пробелами:Если строка читается с помощью операции >> , то чтение прекращается на
первом пробеле.
Чтение строк с пробелами осуществляется функцией:
имя_потока.get(строковая_переменная, кол-во символов)
#include <iostream>
#include <fstream>
using namespace std;
int main( )
{
setlocale(0,"");
char str[80];
ifstream inp("Input.txt"); // открытие файла для чтения
if(!inp) cout << "Нет файла";
inp.get(str, 79); // ввод информации из файла
inp.close( );
// закрытие файла
// вывод данных на экран для контроля
cout << " str = \n" << str <<endl;
return 0;
}
Если в файле записано: «первый второй третий четвертый пятый»
то будет выведено:
8
9.
Обнаружение конца файла:используется функция логического типа eof( )
Функция возвращает true, если считан символ окончания файла,
и false в противном случае.
9
10.
Программа для чтения из файла всех строк до окончания файла#include <iostream>
#include <fstream>
using namespace std;
int main( )
{
setlocale(0,"");
char str[30][80];
// символьный массив для хранения 30 строк из 80 символов
ifstream inp( "Input.txt " ); // открытие файла для чтения
if(!inp) cout << "Нет файла";
int k = 0; // номер строки
while( !inp.eof( ) ) // цикл до окончания файла
{ inp.getline(str[k], 79);
// чтение строки вместе с пробелами с извлечением
// разделительных символов из потока
k++; } // увеличение номера строки на единицу
inp.close( ); // закрытие файла
// вывод данных на экран для контроля
for(int i = 0; i < k; i++) // здесь k кол-во строк, а i номер строки
cout << str[i] <<endl;
return 0;
}
Как изменить программу, чтобы она читала и записывала в массив
не строки, а отдельные слова?
10
11. 3. Запись и считывание одномерного массива
#include <iostream>#include <fstream>
#include <ctime>
using namespace std;
Функция для инициализации одномерного ВЕЩЕСТВЕННОГО массива
// функция инициализации массива случайными числами от 0 до 1
void f_rand(double *af, int nf, double r_min, double r_max)
{
srand((unsigned int) time(NULL)); // рандомизация генератора
for(int i=0; i < nf; i++)
af[i] =
(double) rand()/(double) RAND_MAX *(r_max - r_min) + r_min;
return;
}
11
12.
Функция для записи одномерного массива в файлvoid OutFile( double *a, int nf )
// функция для записи массива в файл
{
ofstream out("output.txt"); // создание и открытие файла для
записи
if(!out)
// проверка успешности открытия файла
cout << "Нет файла OUT";
for (int i = 0; i < nf; i++ )
// nf - размер массива
out << a[i] << " ";
out << endl;
out.close( ); // закрытие файла
}
12
13.
Функция для чтения одномерного массива из файлаvoid InpFile( double *a , int nf )
{ // Функция для чтения массива из файла
ifstream inp("Output.txt"); // открытие файла для чтения
if( !inp )
// проверка успешности открытия файла
cout << "Нет файла INP";
for (int i = 0; i < nf; i++ )
// nf – размер массива
inp >> a[i];
inp.close( ); // закрытие файла
}
13
14.
Главная программа для работы с файломint main( )
{
setlocale(0,"");
// поддержка кириллицы
int n = 7; // размер массива
double*mas = new double [n]; // указатель на массив, присваивание
адреса и выделение памяти
f_rand (mas , n, 0, 1.5); // обращение к функции
OutFile( mas, n); // обращение к функции
InpFile( mas, n);
// обращение к функции
cout<<endl<<endl;
for (int i = 0; i < n; i++ ) // n- размер массива
cout << mas[i] << " "; // вывод массива
cout << endl<<endl; // перевод строк после вывода строки
return 0;
}
14