176.63K
Category: programmingprogramming

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

1.

ФАЙЛЫ

2.

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

3.

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

4.

Файлы
FILE *fp;
FILE - имя типа, описанное в стандартном заголовочном
файле <stdio.h>
fp - указатель на файл.

5.

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

6.

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

7.

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

8.

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

9.

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

10.

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

11.

Пример
11
FILE
*in, *out;
in = fopen ("file1","r");
out = fopen ("file2","w");
Рекомендуется использовать следующий способ открытия файла:
if ((in = fopen("file1.txt", "r")) == NULL)
{
printf("Открыть файл не удалось\n");
exit(1);
}

12.

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

13.

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

14.

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

15.

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

16.

fflush()
16
Например, способ освобождения от нежелательных символов во
входном потоке:
printf("Введите возраст");
scanf("%d", &age);
/*получение возраста*/
printf("Введите размер обуви:");
fflush(stdin);
scanf("%d", &shoesize);

17.

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

18.

remove()
18
Функция remove( ) удаляет файл.
int remove(const char * file_name);
file_name - указатель на строку со спецификацией файла.
При успешном завершении возвращается ноль, в противном случае
возвращается ненулевое значение.

19.

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

20.

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

21.

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

22.

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

23.

Пример
23
#include <stdio.h>
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.

Доступ к данным файла
24
Доступ к данным в файле последовательный
•при открытии файла курсор устанавливается в начало
•чтение выполняется с той позиции, где стоит курсор
•после чтения курсор сдвигается на первый непрочитанный символ

25.

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

26.

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

27.

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

28.

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

29.

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

30.

Пример
30
Считать файл построчно и вывести содержимое на экран
#include <stdio.h>
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.

Пример
31
Текст из файла input.txt выводится на экран. Если файл не найден, на экран выводится
cообщение ”File not found”
#include <stdio.h>
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.

Пример
32
Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается до нажатия
клавиши F6 или CTRL/z (ввод символа EOF – конца файла):
#include <stdio.h>
int main(void)
{
char c;
FILE *out;
out=fopen(“out.txt","w");
while ((c=getch( ) )!=EOF)
fputc(c,out);
fclose(out);
return 0;
}

33.

Пример
33
В программе создается массив, состоящий из четырех целых чисел.
Вывести массив в файл:
#include <stdio.h>
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<n;i++)
fprintf(out,"%6d",array[i]);
fclose(out);
return 0;
}

34.

Пример
34
Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в файле
неизвестно. Требуется найти среднее арифметическое значение этих чисел.
#include <stdio.h>
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.

Функции для работы с
файлами
35
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
36
В языке Си имеется также система низкоуровневого ввода/вывода без
буферизации и форматирования данных, соответствующая стандарту системы
UNIX.
Прототипы составляющих ее функций находятся в файле <io.h>.
open() - открыть файл;
close() - закрыть файл;
read() - читать данные;
write() - записать данные;
lseek() - поиск определенного байта в файле;
unlink( ) - уничтожить файл.
Здесь используются дискрипторы файлов int fp.

37.

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

38.

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

39.

Пример 3
39
Создайте текстовый файл, содержащий гласные буквы каждой
нечетной строки исходного файла и цифры каждой четной
строки файла исходного файла.
English     Русский Rules