358.22K
Категория: ПрограммированиеПрограммирование

Потоки и система ввода-вывода. Работа с файлами

1.

Потоки и система
ввода-вывода.
Работа с файлами
1

2.

Содержание
Файлы и работа с ними
Ввод-вывод файла
Функции для работы с файлами
11.04.2024
2

3.

Файлы и работа с ними
Файл – место на диске со своим именем,
предназначенное для хранения информации.
Существуют два основных типа файлов: текстовые
и двоичные.
Текстовыми называются файлы, состоящие из
любых символов. Они организуются по строкам,
каждая из которых заканчивается символом «конца
строки».
В двоичных файлах информация считывается и
записывается в виде блоков определенного размера,
в которых могут храниться данные любого вида и
структуры
11.04.2024
3

4.

Для работы с файлами в стандартной
библиотеке С++ определен заголовочный
файл fstream, который определяет базовые
типы для чтения и записи файлов. В частности,
это:
• ifstream: для чтения с файла
• ofstream: для записи в файл
• fstream: совмещает запись и чтение
Для работы с файлами в языке Си создана
специальная структура FILE.
Структура FILE описана в stdio.h.
11.04.2024
4

5.

Наиболее частые операции следующее:
• Операторы перенаправления ввода\вывода –
<< и >>
• Методы записи и чтения
строк getline() и get() c put()
• Потоковая запись и чтение
методами write() и read()
• Методы открытия\создания и закрытия
файлов open() и close()
• Методы проверки открыт ли файл is_open() и
достигнут ли конец файла eof()
• Операции позиционирования tellg(),
tellp() и seekg(), seekp()
11.04.2024
5

6.

В программах на C++ при работе с текстовыми
файлами необходимо подключать
библиотеки iostream и fstream.
Для того чтобы записывать данные в текстовый
файл, необходимо:
• описать переменную типа ofstream.
• открыть файл с помощью функции open.
• вывести информацию в файл.
• обязательно закрыть файл.
11.04.2024
6

7.

#include "stdafx.h"
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ofstream fout("cppstudio.txt"); // создаём объект класса
ofstream для записи и связываем его с файлом cppstudio.txt
fout << "Работа с файлами в С++"; // запись строки в файл
fout.close(); // закрываем файл
system("pause");
return 0;
}
11.04.2024
7

8.

Для считывания данных из текстового файла,
необходимо:
• описать переменную типа ifstream.
• открыть файл с помощью функции open.
• считать информацию из файла, при считывании
каждой порции данных необходимо проверять,
достигнут ли конец файла.
• закрыть файл.
11.04.2024
8

9.

Чтение из файла getline()
#include <iostream>
#include <fstream>
#include <string>
int main()
{
string line;
ifstream in("hello.txt"); // окрываем файл для чтения
if (in.is_open())
{
while (getline(in, line))
{
cout << line << std::endl;
}
}
in.close(); // закрываем файл
}
11.04.2024
9

10.

Чтение данных из файла оператор >>
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы
char buff[50]; // буфер промежуточного хранения считываемого из файла текста
ifstream fin("cppstudio.txt"); // открыли файл для чтения
fin >> buff; // считали первое слово из файла
cout << buff << endl; // напечатали это слово
fin.getline(buff, 50); // считали строку из файла
fin.close(); // закрываем файл
cout << buff << endl; // напечатали эту строку
system("pause");
return 0;
}
11.04.2024
10

11.

Работа с файлами
Для работы с файлами в программе нужно:
• описать указатель на объект типа FILE, например
FILE *in;
• установить связи между указателем и конкретным файлом на диске
(открыть файл) с помощью функции fopen():
in = fopen(“имя файла”,”режим”);
• Читать /записать в файл
• Закрыть файл при помощи функции fclose(), аргумент функции указатель на файл, а не имя файла
11.04.2024
11

12.

Функция fopen (1 из 3)
• Возвращает указатель на структуру FILE
• Параметры
Имя файла
Режим описывает, как должен использоваться файл. Основные режимы
работы с файлами:
“r” – файл можно считать,
“w” – файл нужно записать,
“a” – файл можно дополнить.
• Коды являются строками, они заключаются в двойные кавычки.
• Если используется “w” для существующего файла, то старая версия
файла стирается, а программа начинает заносить информацию во
вновь созданный «чистый» файл с тем же именем.
11.04.2024
12

13.

Режимы открытия файлов
• "r"
Открыть для чтения
• "w"
Создать для записи
• "а"
Открыть для добавления в
существующий файл
• "rb"
Открыть двоичный файл для
чтения
• "wb"
Открыть двоичный файл для
записи
• "ab"
Открыть двоичный файл для
добавления
• "r+"
Открыть файл для чтения и
записи
• "w+"
Создать файл для чтения и записи
• "a+"
Открыть для добавления или
создать для чтения и записи
• "а+t" Открыть текстовый файл для
добавления или создать для чтения и
записи
11.04.2024
• "r+b" Открыть двоичный файл для чтения
и записи
• "w+b" Создать двоичный файл для чтения
и записи
• "а+b" Открыть двоичный файл для
добавления или создать для чтения и
записи
• "rt"
Открыть текстовый файл для чтения
• "wt"
Создать текстовый файл для записи
• "at"
Открыть текстовый файл для
добавления
• "r+t"
Открыть текстовый файл для чтения
и записи
• "w+t" Создать текстовый файл для чтения
и записи
13

14.

Функция fopen (2 из 3)
• Если fopen() не может открыть требуемый файл, она возвращает
значение NULL.
• Рекомендуется производить обработку возможных ошибок,
например:
if ( (in = fopen(“test”, “r”) ) == NULL)
printf(“Невозможно открыть файл для чтения !!!”);
11.04.2024
14

15.

Ввод-вывод данных из файла
• Для ввода информации в текстовой файл и чтения ее из файла
можно использовать функции fprintf() и fscanf().
• Эти функции работают аналогично функциям printf() и scanf(), но
имеют дополнительный аргумент для ссылки на сам файл.
• Указатель на файл – первый в списке аргументов
11.04.2024
15

16.

Пример 1
#include <stdio.h>
main()
{ FILE fi;
int age;
fi = fopen(“sam”,”r”);
fscanf(fi,”%d”,&age);
fclose(fi);
fi = fopen(“data”,”a”);
fprintf(fi,”Число %d из файла sam”,age);
fclose(fi);
11.04.2024
}
16

17.

Функции fgets() и fputs()
Для работы с текстовыми файлами удобно использовать функции
fgets() и fputs(). Их описание имеет вид:
fgets(char *s, int n, FILE *stream);
fputs(char *s, FILE *stream);
Здесь :
s – символьный массив (строка),
n – максимальная длина считываемой строки,
stream – указатель на объект типа FILE.
11.04.2024
17

18.

Функция fputs()
Функция fputs() записывает, ограниченную символом ‘\0’ строку (на
которую указывает s) в файл, определённый указателем stream.
Символ ‘\0’ в файл не переноситься, и символ ‘\n’ не записывается в
конце строки вместо ‘\0’.
11.04.2024
18

19.

Функция fgets() (1 из 2)
• Функция fgets() читает из определённого указателем stream файла
не более (n-1) символов и записывает их в строку, на которую
указывает s.
• Функция прекращает чтение, как только прочитает (n-1) символов
или встретит символ новой строки ‘\n’, который переноситься в
строку s.
11.04.2024
19

20.

Функция fgets() (2 из 2)
• Дополнительно в конец каждой строки записывается признак
окончания строки ‘\0’. В случае успешного завершения функция
возвращает указатель s.
• При ошибке или при достижении конца файла, при условии, что из
файла не прочитан ни один символ, возвращается значение NULL. В
этом случае содержимое массива, который адресуется указателем
s, остаётся без изменений.
11.04.2024
20

21.

Функции fread() и fwrite()
Если в файле отсутствует разбиение информации на строки, то есть
файл носит ярко выраженный битовый (двоичный) характер, для
операций ввода-вывода информации целесообразно пользоваться
функциями fread() и fwrite().
Описание этих функций имеет вид:
• fread(void *buf, int size, int n, FILE *stream);
• fwrite(void *buf, int size, int n, FILE *stream);
11.04.2024
21

22.

Здесь
• buf – массив для чтения/записи информации,
• size – размер считываемого блока в байтах,
• n – количество блоков по size байт, считываемых (записываемых) за
один раз,
• stream – указатель на файл.
Таким образом, за один раз из файла считывается (или в файл
записывается) size*n байт информации.
11.04.2024
22

23.

Положение указателя в файле
Начальная позиция чтения/записи в файле устанавливается при
открытии файла и может соответствовать начальному или
конечному положению.
Существует возможность «быстрой» смены текущей позиции (без
ввода-вывода информации). Для этого существует функция
fseek(FILE *stream, long n, int whence);
11.04.2024
23

24.

Здесь
• stream – указатель на файл, в котором осуществляется
перемещение;
• n – целое число, которое указывает на сколько байт необходимо
изменить текущую позицию в файле относительно точки, на
которую указывает третий параметр функции;
• whence – точка отсчета для изменения текущей позиции в файле.
Величина whence может принимать только одно из трех значений:
0 (SEEK_SET) – отчёт будет производиться от начала файла,
1 (SEEK_CUR) – относительно текущего положения курсора,
2 (SEEK_END) – относительно конца файла.
11.04.2024
24

25.

Пример 2
В качестве примера приведём программу, которая считывает из файла f1 3
блока по 5 байт и записывает эти блоки в файл f2 в обратном порядке:
#include<stdio.h>
void main()
{ FILE *in, *out;
char A[5];
in=fopen(“f1”,”r”); out=fopen(“f2”,”w”);
fseek(in,10,SEEK_SET);
fread(A,5,1,in);
fwrite(A,5,1,out);
fseek(in,-10,SEEK_CUR);
fread(A,5,1,in);
fwrite(A,5,1,out);
fseek(in,-10,SEEK_CUR);
fread(A,5,1,in);
fwrite(A,5,1,out);
fclose(in);
fclose(out); }
11.04.2024
25

26.

Функция feof() (1 из 2)
Часто, при чтении информации из файла, необходимо знать,
достигнут конец файла или нет.
Это можно сделать, используя функцию feof() обращение к которой
выглядит следующим образом:
int feof (FILE *stream);
11.04.2024
26

27.

Функция feof() (2 из 2)
Если при чтении из указанного файла достигнут его конец, то
возвращается значение NULL, в противном случае возвращается
ненулевое значение.
Если не предпринималась попытка прочитать из файла
отсутствующий символ, следующий за последним, то функция feof()
не будет сигнализировать о том, что достигнут конец файла.
11.04.2024
27

28.

Функции для работы с файлами
fopen()
Открыть файл
fclosе()
Закрыть файл
putc()
Записать символ в поток
getc()
Прочитать символ из потока
fseek()
Переместить указатель позиции файла на указанное место
fprintf()
Форматная запись в файл
fscanf()
Форматное чтение из файла
feof()
Возвращает значение "истинно", если достигнут конец файла
ferror()
Возвращает значение "ложно'', если обнаружена ошибка
fread()
Читает блок данных из потока
11.04.2024
28

29.

Задания для самостоятельного
решения
Вариант 1.
Напечатать текст из файла, подчёркивая (ставя минусы в
соответствующих позициях следующей строки) все входящие в него
заглавные буквы.
Вариант 2.
Скопировать содержимое одного текстового файла в другой,
исключая пустые строки.
Вариант 3.
Напечатать последнюю из самых коротких строк текстового файла.
Вариант 4.
Разработать программу, которая построчно печатает содержимое
текстового файла, вставляя в начало каждой печатаемой строки её
порядковый номер (он должен занимать 4 позиции) и пробел.
Вариант 5.
Разработать программу, подсчитывающую количество символов, слов
и строк в текстовом файле.
11.04.2024
29

30.

Вариант 6.
Скопировать строки из одного текстового файла в другой, расположив
их в нем в порядке уменьшения длинны.
Вариант 7.
Разработать программу, копирующую из одного текстового файла в
другой строки, оканчивающиеся восклицательным знаком.
Вариант 8.
Разработать программу, которая ставит в начало каждой стоки
текстового файла столько пробелов, сколько в ней встречается их.
Вариант 9.
Написать программу, которая копирует текст из файла, в другой файл,
заменяя все строчные буквы на прописные.
11.04.2024
30

31.

Контрольные вопросы
по теме работы
1.
2.
3.
Что такое файл?
Как описать указатель на объект типа FILE?
Как установить связь между указателем и конкретным файлом на
диске?
4. Какое значение может принимать второй параметр функции
fopen()?
5. Как отследить ошибку в программе, которая может возникнуть
при открытии несуществующего файла на чтение?
6. Каково предназначение параметров функций fread() и fwrite()?
7. Для чего используется функция fseek()?
8. Как отследить конец файла при чтении информации из него?
9. Для чего необходима функция fclose()?
10. В каких случаях при вводе строки следует отдавать предпочтение
функции gets() перед функцией scanf()?
11.04.2024
31

32.

Определение
некоторых понятий
• Включаемый файл- текстовый файл, являющийся частью
транслируемого модуля, поименованный в директиве #include
исходного файла С++ или в другом включаемом файле.
• Входной поток- поток, из которого можно производить чтение.
• Выходной поток- поток , в который можно производить запись.
• Исполняемый файл- файл. Который операционная система может
выполнять без дальнейшей трансляции или интерпретации.
• Исходный файл- текстовый файл, который транслятор С++ может
транслировать в объектный модуль.
11.04.2024
32

33.

Итоги
Рассмотренные вопросы:
• Файлы
• Функции для работы с файлами
• Ввод- вывод файла
11.04.2024
33
English     Русский Правила