ОАиП текстовые файлы

Содержание

Слайд 2

Файл - способ хранения информации на физическом устройстве. Файл представляется потоком

Файл - способ хранения информации на физическом устройстве. Файл представляется потоком

байтов.
Файлы предназначены только для хранения информации, а обработка этой информации осуществляется  программами.
Файл, не содержащий ни одного элемента, называется пустым.
Создается файл путем добавления новых записей в конец первоначально пустого файла.
Длина файла, т.е. количество элементов, не задается при определении файла. 
В языке Си отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку ввода-вывода языка Си (stdio.h - standart input output). Они позволяют работать с различными устройствами, такими, как диски, принтер, коммуникационные каналы и т.д.

Файл. Определение.

Слайд 3

Текстовые файлы представляют собой последовательность ASCII символов и могут быть просмотрены

Текстовые файлы представляют собой последовательность ASCII символов и могут быть просмотрены

и отредактированы с помощью любого текстового редактора. Эта последовательность символов разбивается на строки символов, при этом каждая строка заканчивается двумя кодами «перевод строки», «возврат каретки»: 13 и 10 (0xD и 0xA).
При обнаружении в текстовом файле символа с кодом 26 (0x26), т.е. признака конца файла, чтение файла в текстовом режиме заканчивается, хотя файл может иметь продолжение.
Бинарные (двоичные) файлы представляют собой последовательность данных, структура которых определяется програмно.
В языке Си не предусмотрены никакие заранее определенные структуры файлов. Все файлы рассматриваются компилятором как последовательность (поток байт) информации.

Виды файлов

Слайд 4

FILE *fp; FILE - имя типа, описанное в стандартном заголовочном файле

FILE *fp;
FILE - имя типа, описанное в стандартном заголовочном файле


fp - указатель на файл.

Файлы

Слайд 5

Правила работы с файлами Последовательность работы с файлами: создать указатель на

Правила работы с файлами

Последовательность работы с файлами:
создать указатель на файл
связать указатель

с файлом
открыть файл
работа с файлом
закрыть файл
Слайд 6

fopen() Прежде чем читать или записывать информацию в файл, он должен

fopen()

Прежде чем читать или записывать информацию в файл, он должен быть

открыт функцией fopen и тем самым связан с потоком ввода-вывода.
Функция открытия потока возвращает указатель fp на структуру типа FILE при успешном открытии потока, или NULL в противном случае.
В stdio.h заданы 3 предопределенных потока :
 stdin (стандартный поток ввода), 
stdout (стандартный поток вывода), 
stderr (стандартный поток ошибок) 
Вывод данных через stdout и stderr по умолчанию осуществляется на консоль. Ввод данных через stdin по умолчанию осуществляется через клавиатуру. 
Предопределенные потоки всегда открыты. 
Слайд 7

fopen() При открытии файла указатель на файл связывается с конкретным файлом

fopen()

При открытии  файла  указатель  на файл связывается с конкретным файлом на

диске :
FILE *fopen(const char *filename, const char *mode);
FILE *fp;
fp = fopen(" путь/имя файла", "режим доступа");
Имя/путь файла имеет вид:
"c:\\input.txt" - для файла input.txt на диске с:
"input.txt " - для файла input.txt в рабочем каталоге программы
"режим доступа"- определяет режим открытия файла.
Слайд 8

Режимы доступа r - открыть существующий файл для чтения; w -

Режимы доступа

r - открыть существующий файл для чтения; w - создать новый

файл для записи (если файл с указанным именем существует, то он будет переписан); а - дополнить файл (открыть существующий файл для записи информации, начиная с конца файла, или создать файл, если он не существует);
r+ - открыть существующий файл для чтения и записи; w+ - создать новый файл для чтения и записи; a+ - дополнить или создать файл с возможностью чтения и записи;
Слайд 9

Режимы доступа rb - открыть двоичный файл для чтения; wb -

Режимы доступа

rb - открыть двоичный файл для чтения; wb - создать двоичный

файл для записи; аb - дополнить двоичный файл; r+b - открыть двоичный файл для чтения и записи; w+b - создать двоичный файл для чтения и записи; а+b - дополнить двоичный файл с предоставлением возможности чтения и записи;
rt - открыть текстовой файл для чтения; wt - создать текстовый файл для записи; at - дополнить текстовый файл; r+t - открыть текстовой файл для чтения и записи; w+t - создать текстовый файл для чтения и записи; a+t - дополнить текстовый файл с предоставлением возможности записи и чтения.
r+t = rt+
Слайд 10

Особенности имя файла упоминается только в функции fopen, обращение к файлу

Особенности

имя файла упоминается только в функции fopen, обращение к файлу идет

через файловую переменную
файл, который открывается на чтение, должен существовать
если файл, который открывается на запись, существует, старое содержимое уничтожается
данные записываются в файл в текстовом виде, если не включен режим записи в двоичном виде
при завершении программы все файлы закрываются автоматически
после закрытия файла файловую переменную можно использовать еще раз для работы с другим файлом
Слайд 11

Пример FILE *in, *out; in = fopen ("file1","r"); out = fopen

Пример

FILE  *in, *out;
in = fopen ("file1","r");
out = fopen ("file2","w");
Рекомендуется использовать следующий

способ открытия файла:
if ((in = fopen("file1.txt", "r")) == NULL)
{
printf("Открыть файл не удалось\n");
exit(1);
}
Слайд 12

fclose() После окончания работы с файлом он должен быть закрыт. Закрытие

fclose()

После окончания работы с файлом он должен быть закрыт.
Закрытие файла

(текстового или бинарного) выполняется  функцией fclose(): 
fclose(FILE *fp);
При этом разрывается связь указателя на файл c внешним набором данных. Освободившийся указатель можно использовать для другого файла. При успешном завершении операции функция fclose( ) возвращает значение нуль. Любое другое значение свидетельствует об ошибке.
fclose(in);
int closeall(void) – закрывает все файлы, открытые в программе, при успешной работе возвращает число закрытых потоков, при неуспешной - EOF.
Слайд 13

feof() При каждой операции ввода/вывода происходит перемещение указателя текущей позиции в

feof()

При каждой операции ввода/вывода происходит перемещение указателя текущей позиции в файле,

в какой-то момент указатель достигает конца файла. Структура типа FILE имеет поле – индикатор конца файла.
Функция feof() проверяет состояние индикатора конца файла и возвращает значение 0, если конец файла не был достигнут, или значение, отличное от нуля, если был достигнут конец файла. Функция имеет единственный аргумент – указатель на поток типа FILE.
if (! feof(in))…
проверяет, что конец файла еще не достигнут.
Слайд 14

freopen() Если требуется изменить режим доступа к открытому в настоящий момент

freopen()

Если требуется изменить режим доступа к открытому в настоящий момент файлу,

то его необходимо сначала закрыть, а затем вновь открыть с другими правами доступа. Для этого используется функция
FILE* freopen (char *ID_файла, char *режим, FILE *указатель_файла);
Данная функция сначала закрывает файл, заданный в третьем параметре (указатель файла), как это выполняет функция fclose, а затем выполняет действия, аналогичные функции fopen, используя указанные первый и второй параметры (открывает файл с ID_файла и правами доступа режим).
Слайд 15

fflush() Если заданный файл открыт для вывода, то содержимое буфера, записывается

fflush()

Если заданный файл открыт для вывода, то содержимое буфера, записывается в

него. Если файл открыт для ввода, то функция fflush очищает содержимое буфера. После вызова функции файл остается открытым.
Прототип: int fflush(FILE *fp);
Функция fflush возвращает 0, если буфер успешно обновлен. Это же значение возвращается, когда файл открыт только для чтения. В случае возникновения ошибки возвращается значение EOF (−1).
Буферы автоматически обновляются, когда они полны, когда файл закрывается или произошло нормальное окончание работы программы без закрытия файла.
Слайд 16

fflush() Например, способ освобождения от нежелательных символов во входном потоке: printf("Введите

fflush()

Например, способ освобождения от нежелательных символов во входном потоке:
printf("Введите возраст");


scanf("%d", &age);  /*получение возраста*/
printf("Введите размер обуви:");
fflush(stdin);
scanf("%d", &shoesize);
Слайд 17

ferror() Функция ferror( ) позволяет проверить правильность выполнения последней операции при

ferror()

Функция ferror( ) позволяет проверить правильность выполнения последней операции при работе

с файлами.
int ferror(FILE *fp);
В случае ошибки возвращается ненулевое значение, в противном случае возвращается ноль.
Слайд 18

remove() Функция remove( ) удаляет файл. int remove(const char * file_name);

remove()

Функция remove( ) удаляет файл.
int remove(const char * file_name);
file_name -

указатель на строку со спецификацией файла.
При успешном завершении возвращается ноль, в противном случае возвращается ненулевое значение.
Слайд 19

rewind() Функция rewind( ) устанавливает указатель текущей позиции в начало файла. void rewind(FILE *fp);

rewind()

Функция rewind( ) устанавливает указатель текущей позиции в начало файла.
void rewind(FILE

*fp);
Слайд 20

Запись – чтение функции посимвольного ввода-вывода функции построчного ввода-вывода функции ввода-вывода по блокам

Запись – чтение

функции посимвольного ввода-вывода
функции построчного ввода-вывода
функции ввода-вывода по блокам

Слайд 21

fprintf() Функция fprintf( ) выполняет те же действия, что и функция

fprintf()

Функция fprintf( ) выполняет те же действия, что и функция printf(

), но работает с файлом.
Прототип: int fprintf(FILE *fp, const char *format, ...);
В качестве первого параметра задается указатель на переменную файлового типа.
Возвращаемое значение равно количеству реально выведенных символов. Если при выводе возникла ошибка, возвращается отрицательное число.
Пример:
fprintf(fp, "%х", а);
Слайд 22

fscanf() Функция fscanf( ) выполняет те же действия, что и функция

fscanf()

Функция fscanf( ) выполняет те же действия, что и функция scanf(),

но работает с файлом.
В качестве первого параметра задается указатель на переменную файлового типа.
Прототип: int fscanf(FILE *fp, char *format,...)
Возвращает количество считанных параметров.
При попытке считывания конца файла возвращается значение EOF.
Пример:
fscanf(fp, "%х", &a);
Слайд 23

Пример #include int main( ) { FILE *in, *out; int a;

Пример

#include
int main( )
{
FILE *in, *out;
int

a;
in=fopen("input.txt","r"); /* считывание */
fscanf(in,"%d",&a);
fclose(in);
out=fopen("output.txt", "a"); /*дополнение*/
fprintf(out,"Data is %d.\n",a);
fclose(out);
return 0;
}
Слайд 24

Доступ к данным файла Доступ к данным в файле последовательный при

Доступ к данным файла

Доступ к данным в файле последовательный
при открытии файла

курсор устанавливается в начало
чтение выполняется с той позиции, где стоит курсор
после чтения курсор сдвигается на первый непрочитанный символ
Слайд 25

fputc() Функция fputc( ) записывает символ в файл. Прототип: int fputc(int

fputc()

Функция fputc( ) записывает символ в файл.
Прототип: int fputc(int с, FILE

*fp);
fp - указатель на файл, возвращенный функцией fopen(), с - символ.
При успешном завершении fputc( ) возвращает записанный символ, в противном случае возвращается константа EOF.
int ch; ....
fputc(ch, fo);
Слайд 26

fgetc() Функция fgetc( ) читает символ из файла. Прототип: int fgetc(FILE

fgetc()

Функция fgetc( ) читает символ из файла.
Прототип: int fgetc(FILE *fp);

fp - указатель на файл, возвращенный функцией fopen( ).
Эта функция возвращает прочитанный символ.
Соответствующее значение имеет тип int, но старший байт
равен нулю.
Если достигнут конец файла, то fgetc( ) возвращает значение ЕОF.
int ch; ...
ch=fgetc(fi);
читает символ из файла, на который указывает fi
Слайд 27

feof() Функция feof( ) определяет конец файла при чтении двоичных данных.

feof()

Функция feof( ) определяет конец файла при чтении двоичных данных.
Прототип: int

feof(FILE *fp);
fp - указатель на файл, возвращенный функцией fopen( ).
При достижении конца файла возвращается ненулевое значение, в противном случае возвращается 0.
Пример:
while (!feof(f))
fscanf (f, “%d”, &x);
Коварство функции: если в конце последовательности
стоит пробел, то конец файла еще не достигнут,
то очередное число прочитать невозможно.
Слайд 28

fputs() Функция fputs( ) записывает строку символов в файл. Она отличается

fputs()

Функция fputs( ) записывает строку символов в файл.
Она отличается от

функции puts( ) только тем, что в качестве второго параметра должен быть записан указатель на переменную файлового типа. Символ конца строки ('0') не записывается.
Прототип: int fputs(const char *str, FILE *fo);
Например:
l = fputs("Ехаmple", fo);
При успешном выполнении функция fputs() возвращает неотрицательное значение (последний записанный символ), а при неудачном — значение EOF.
В отличии от puts функция fputs( ) не добавляет в конец
строки символ перехода на новую строку.
Слайд 29

fgets() Функция fgets( ) читает строку символов из файла. Она отличается

fgets()

Функция fgets( ) читает строку символов из файла.
Она отличается от

функции gets( ) тем, что имеет три параметра, третий - указатель на переменную файлового типа.
Прототип: char *fgets(char *str, int n, FILE *fi)
Строка считывается целиком, если ее длина не превышает указанного числа символов, в противном случае функция считывает только заданное число символов.
Пример:
...
fgets(string, n, fi);
Функция возвращает указатель на строку string при успешном завершении и константу NULL в случае ошибки либо достижения конца файла.
Слайд 30

Пример Считать файл построчно и вывести содержимое на экран #include int

Пример

Считать файл построчно и вывести содержимое на экран
#include
int main(

)
{
FILE *f1;
char *str;
str= (char*)calloc (1,1);
f1=fopen("input.txt","r");
while (fgets(str,255,f1) != NULL)
puts(str);
return 0;
}
Слайд 31

Пример Текст из файла input.txt выводится на экран. Если файл не

Пример

Текст из файла input.txt выводится на экран. Если файл не найден, на экран

выводится cообщение ”File not found”
#include 
int main(void)
{
FILE *ptr;
unsigned char ch;
if ((ptr=fopen(" input.txt ","r"))!=NULL)
{
ch=fgetc(ptr);
while (!feof(ptr))
{
printf("%c",ch);
ch=fgetc(ptr);
}
fclose(ptr);
}
еlse printf("\nFile not found!");
return 0;
}
Слайд 32

Пример Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается до

Пример

Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается до нажатия

клавиши F6 или CTRL/z (ввод символа EOF – конца файла):
#include 
int main(void)
{
char c;
FILE *out;
out=fopen(“out.txt","w");
while ((c=getch( ) )!=EOF)
fputc(c,out);
fclose(out);
return 0;
}
Слайд 33

Пример В программе создается массив, состоящий из четырех целых чисел. Вывести

Пример

В программе создается массив, состоящий из четырех целых чисел. Вывести массив в файл:
#include 
int main()


{
int i=0;
int n=4;
int array[4]={4,44,446,4466};
FILE *out;
out=fopen(“output.txt","w");
for(i=0;i fprintf(out,"%6d",array[i]);
fclose(out);
return 0;
}
Слайд 34

Пример Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел

Пример

Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в

файле неизвестно. Требуется найти среднее арифметическое значение этих чисел.
#include 
int main() {
int S=0, count=0, numb;
double av;
FILE *in;
if ((in=fopen("input.txt","r"))!=NULL)
{
while (!feof(in))
{
fscanf(in,"%d",&numb);
S+=numb;
count++;
printf("%d\n", numb);
}
av=(double)S/count;
printf("Average=%f\n", aver);
fclose(in);
}
else
printf("\nФайл не найден!");
return 0; }
Слайд 35

Функции для работы с файлами int fileno (FILE *f) определяет и

Функции для работы с файлами

int fileno (FILE *f) определяет и возвращает

значение дескриптора (fd) файла f, т.е. число, определяющее номер файла
long filelength (int fd) возвращает длину файла, имеющего дескриптор fd , в байтах
int chsize (int fd, long pos) выполняет изменение размера файла, имеющего номер fd, признак конца файла устанавливается после байта с номером pos
int fgetpos (FILE *f, long *pos) определяет значение текущей позиции pos файла f
int rename( char * old, char *new) – переименованиие файла, при успехе функция возвращает 0, при неуспехе - -1.
Слайд 36

Функции для Unix В языке Си имеется также система низкоуровневого ввода/вывода

Функции для Unix

В языке Си имеется также система низкоуровневого ввода/вывода без

буферизации и форматирования данных, соответствующая стандарту системы UNIX.
Прототипы составляющих ее функций находятся в файле .
open() - открыть файл; close() - закрыть файл; read() - читать данные; write() - записать данные; lseek() - поиск определенного байта в файле; unlink( ) - уничтожить файл.
Здесь используются дискрипторы файлов int fp.
Слайд 37

Пример 1 На первой строке в файле записана размерность целочисленной матрицы.

Пример 1

На первой строке в файле записана размерность целочисленной матрицы. Далее

– сама матрица. Считать матрицу в память и вывести ее на экран. Данные записаны в файле data.txt.
Слайд 38

Пример 2 В текстовом файле записано произвольное количество чисел. Считать данные

Пример 2

В текстовом файле записано произвольное количество чисел. Считать данные из

файла в массив и вывести на экран.