Файлы в Си

Содержание

Слайд 2

Слайд 3

Слайд 4

Тип доступа вызов функции создания (открытия) файла изменение переменной _fmode (stdio.h) O_TEXT O_BINARY

Тип доступа

вызов функции создания (открытия) файла

изменение переменной _fmode (stdio.h)

O_TEXT
O_BINARY

Слайд 5

Библиотечные функции Префиксные Поточные Открытые файлы операционной системы Префикс Файл 0

Библиотечные
функции

Префиксные

Поточные

Открытые файлы операционной системы

Префикс

Файл

0

stdin

1

stdout

2

stderr

3

stdaux

4

stdprn

Слайд 6

Механизм чтения из файла

Механизм чтения из файла

Слайд 7

Механизм записи в файл Открыть файл для записи 123 87 Текстовый файл

Механизм записи в файл

Открыть файл для записи

123

87

Текстовый файл

Слайд 8

Двоичный файл 0 1 2 3 4 5 6 7

Двоичный файл

0

1

2

3

4

5

6

7

Слайд 9

Функции для поточного доступа к файлам Функции поточного ввода-вывода называют стандартными

Функции для поточного доступа к файлам

Функции поточного ввода-вывода называют

стандартными функциями ввода-вывода.
Си создает внутреннюю структурную переменную по шаблону FILE (stdio.h).
Слайд 10

FILE* fopen (const char *filename, const char* mode) возвращает указатель на

FILE* fopen (const char *filename, const char* mode)

возвращает указатель на
переменную

типа FILE

константная строка - имя файла

режим открытия файла

В случае неуспеха функция возвращает значение NULL

Режимы открытия файла
r - открыть для чтения.
w - создать для записи.

Слайд 11

a – открыть файл для обновления, открывает файл для записи в

a – открыть файл для обновления, открывает файл для записи в

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

b – открыть файл в двоичном режиме. По умолчанию установлен текстовый

b – открыть файл в двоичном режиме.
По умолчанию установлен текстовый режим

доступа к файлу.
Режимы t и b указываются вторыми символами в строковой переменной mode, например “r+b”.
Слайд 13

Проверка корректности открытия файла: int main(int argc, char *argv[]) { system("chcp

Проверка корректности открытия файла:

int main(int argc, char *argv[])
{ system("chcp 1251");
FILE

*f;
char name [] = "prim.txt";
if ((f = fopen(name,"rb"))==NULL) {
printf( "File not found ");
system("PAUSE"); }
else printf( "Ok... ");
system("PAUSE");
return EXIT_SUCCESS;}
Слайд 14

int fclose(FILE *fp) - закрывает файл fp, при успешной работе возвращает

int fclose(FILE *fp) - закрывает файл fp, при успешной работе возвращает

0, при неуспешной EOF).
int closeall(void) – закрывает все файлы, открытые в программе, при успешной работе возвращает число закрытых потоков, при неуспешной - EOF.
FILE *freopen(const char *filename, const char* mode, FILE *stream) – закрывает поток stream, открывает поток filename с новыми правами доступа установленными в mode. Если потоки разные, то происходит переадресация потока stream в поток filename.
Слайд 15

…char name[] = "prim.txt"; int n; FILE *f; printf( “Введите целое

…char name[] = "prim.txt";
int n;
FILE *f;
printf( “Введите

целое число n: ");
scanf("%d", &n);
freopen(name,"wt",stdout);
for (int i=0;i printf("%d\n",i);
fclose(f);
system("PAUSE");
return EXIT_SUCCESS; …
Слайд 16

ch = fgetc( ) – возвращает символ ch из файла, с

ch = fgetc( <указатель на файл>) – возвращает символ ch из

файла, с которым связан указатель.
ch = getc( <указатель на файл>) – возвращает символ ch из файла, с которым связан указатель.
fputc(ch,<указатель на файл>) – записать символ ch в указанный файл.
putc(ch,<указатель на файл>) – записать символ ch в файл.
fgets(str, n, <указатель на файл>) – прочитать строку str, длиной n символов, или до первого встреченного \n из указанного файла.
Слайд 17

fputs(str, ) – записать строку str, в файл. Символ перевода на

fputs(str, <указатель на файл>) – записать строку str, в файл. Символ

перевода на другую строку в файл не записывается.
fscanf( <указатель на файл>, управляющая строка, ссылка) – универсальная функция считывания из текстового файла.
fscanf(f,”%d”,&n)
fread(ptr,size,n,<указатель на файл>) – считывает n элементов размером size в область памяти, начиная с ptr. В случае успеха возвращает количество считанных элементов, в случае неуспеха – EOF.
Слайд 18

fwrite(ptr,size,n, ) – записывает n элементов размером size из памяти, начиная

fwrite(ptr,size,n,<указатель на файл>) – записывает n элементов размером size из памяти,

начиная с ptr в файл– в случае успеха возвращает количество записанных элементов, в случае неуспеха – EOF.
fprintf( <указатель на файл>, управляющая строка, [список аргументов] ) – форматированный вывод в файл.
функции прямого доступа к файлу
rewind( <указатель файла>) – установить указатель файла на начало файла.
Слайд 19

int fseek( , offset, fromwheare) - установить указатель чтения-записи файла на

int fseek( <указатель файла>, offset, fromwheare) - установить указатель чтения-записи файла

на позицию offset, относительно позиции fromwheare.
значения fromwheare
SEEK_END – от конца файла,
SEEK_SET – от начала файла,
SEEK_CUR – от текущей позиции.
Слайд 20

long int n = ftell ( ) – в переменную n

long int n = ftell ( <указатель на файл>) – в

переменную n передать номер текущей позиции в файле.
int z = fgetpos ( <указатель файла>, npos) - в динамической памяти по адресу npos записать номер текущей позиции в файле, в случае успеха функция возвращает 0; в противном случае – любое ненулевое число.
int unlink ( <имя файла>) – удаление файла, при успехе функция возвращает 0, при неуспехе - -1.
int rename( <старое имя>,<новое имя>) – переименованиие файла, при успехе функция возвращает 0, при неуспехе - -1.
int feof ( <указатель на файл>) возвращает 0, если конец файла не достигнут, любое ненулевое число, если достигнут.
Слайд 21

int ferror( ) возвращает ненулевое значение, если при работе с файлом

int ferror( <указатель на файл>) возвращает ненулевое значение, если при работе

с файлом возникла ошибка, 0 – в противном случае.
Слайд 22

Примеры работы с файлами Запись данных в текстовый файл Пример 1.

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

Запись данных в текстовый файл

Пример 1. Создать

вещественный массив случайным образом и сохранить его в текстовом файле.

#include
int main(int argc, char *argv[])
{ int n;
FILE *f;
int flag = 1;
char name[25];

Слайд 23

system("chcp 1251"); // Создадим цикл, позволяющий корректировать ввод // имени файла

system("chcp 1251");
// Создадим цикл, позволяющий корректировать ввод
// имени файла
do
{

printf( "Введите имя создаваемого файла: ");
scanf("%s",name);
// Попытка открыть файл для чтения. Если такой файл // уже существует, то задать вопрос пользователю
if ((f = fopen(name,"r"))!=NULL)
{
// Заменить существующий файл?
Слайд 24

printf("Файл уже существует. Заменить? (y/n)"); char ch = getch(); // Если

printf("Файл уже существует. Заменить? (y/n)");
char ch = getch();
// Если пользователь нажал

кнопку «n», очистить
// экран, вернуться к началу цикла
if (ch == 'n') { system("cls"); continue; }
}
// В этот блок программы управление попадет только
// если пользователь подтвердил замену или задал имя
// несуществующего файла.
// Создать файл.
if ((f=fopen(name,"w"))==NULL)
{
printf("Ошибка создания файла");
system("PAUSE");
Слайд 25

break; } printf("\nВведите размерность массива: "); scanf("%d",&n); for(int i=0;i { float

break;
}
printf("\nВведите размерность массива: ");
scanf("%d",&n);
for(int i=0;i{ float y = rand()

%100/(rand()%50+1.)-rand()%30;
// На одной строке файла печатать только 10
// элементов.
if (i>=10&&i%10==0) fprintf(f,"\n");
fprintf(f,"%8.3f",y);
}
// Закрыть файл.
fclose(f);
Слайд 26

// Закончить цикл flag = 0; } while (flag); printf(“Файл создан. "); system("PAUSE"); return EXIT_SUCCESS; }

// Закончить цикл
flag = 0;
} while (flag);
printf(“Файл создан. ");
system("PAUSE");
return

EXIT_SUCCESS;
}
Слайд 27

Слайд 28

Чтение данных из текстового файла

Чтение данных из текстового файла

Слайд 29

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

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

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

int main(int argc, char *argv[])
{
system("chcp 1251");
FILE *f;

Слайд 30

f = fopen(“data.txt", "r"); // Проверка ошибки открытия файла if (f==NULL)

f = fopen(“data.txt", "r");
// Проверка ошибки открытия файла
if (f==NULL) {
printf("Файл не

найден... /n Для окончания работы нажмите любую клавишу...");
system("pause");
exit(0);
}
int n,m;
// Чтение размерности матрицы
fscanf(f,"%d",&n);
fscanf(f,"%d",&m);
int **a;
// Выделение памяти под матрицу
Слайд 31

a = new int* [n]; for(int i=0;i a[i] = new int

a = new int* [n];
for(int i=0;i a[i] = new int [m];
//

Чтение матрицы
for(int i=0;i for(int j=0;j fscanf(f,"%d",&a[i][j]);
printf("Прочитана матрица: \n");
// Печать элементов матрицы
for( int i=0;i for(int j=0;j printf("%5d",a[i][j]);
printf("\n"); }
system("pause");
}
Слайд 32

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

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

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

int main(int argc, char *argv[])
{
system("chcp 1251");
FILE *f;

Слайд 33

f = fopen("my.txt", "r"); // Проверка ошибки открытия файла if (f==NULL)

f = fopen("my.txt", "r");
// Проверка ошибки открытия файла
if (f==NULL) {
printf("Файл не

найден... /n Для окончания работы нажмите любую клавишу...");
system("PAUSE");
exit(0);
}
int n=0,y;
int *a;
// пока не конец файла f
while (!feof(f))
{
Слайд 34

// читать элемент и int z = fscanf(f,"%d",&y); if (!z) continue;

// читать элемент и
int z = fscanf(f,"%d",&y);
if (!z) continue;
//

увеличивать счетчик.
n++;
}
// После окончания цикла в переменной n хранится
// количество целых чисел, записанных в файле.
// Выделить память под массив.
a = new int [n];
// Указатель чтения-записи файла передвинуть в
// начало.
fseek(f,0,SEEK_SET);
// Читать n целых чисел из файла в массив.
for(int i=0;i
Слайд 35

fscanf(f,"%d",&a[i]); printf("Прочитан массив: \n"); for(int i=0;i printf("%5d",a[i]); printf("\n"); system("PAUSE"); }

fscanf(f,"%d",&a[i]);
printf("Прочитан массив: \n");
for(int i=0;i printf("%5d",a[i]);
printf("\n");
system("PAUSE");
}

Слайд 36

Изменение текстового файла Пример 4. В текстовом файле расположен произвольный текст.

Изменение текстового файла

Пример 4. В текстовом файле расположен произвольный текст. Не

считывая весь текст в память изменить все первые буквы слов на прописные.

int main(int argc, char *argv[])
{
// Откроем файл для чтения с дополнением.
// Символ окончания файла в этом случае
// автоматически удаляется.
FILE *f = fopen("text.txt","r+");

Слайд 37

FILE *f1 = fopen("text.txt","r+"); if (f==NULL) { printf("Файл не найден. \n");

FILE *f1 = fopen("text.txt","r+");
if (f==NULL) {
printf("Файл не найден. \n");
system("PAUSE");
return EXIT_SUCCESS;
}
char word[100];
long

pos1;
// Организуем бесконечный цикл для чтения файла.
Слайд 38

while (1) { // Если чтение прошло неуспешно, значит достигнут конец

while (1) {
// Если чтение прошло неуспешно, значит достигнут конец
//

файла,
// в этом случае нужно закончить выполнение цикла
if ( fscanf(f,"%s",word)!=1) break;
// В переменную pos1 получить текущую
// позицию указателя чтения-записи.
pos1 = ftell(f);
// Установить указатель на позицию, с которой было
// считано слово.
Слайд 39

fseek(f1,pos1-strlen(word),SEEK_SET); word[0] = toupper(word[0]); printf(" %s\n",word); // Записать в файл измененное

fseek(f1,pos1-strlen(word),SEEK_SET);
word[0] = toupper(word[0]);
printf(" %s\n",word);
// Записать в файл измененное слово.

fprintf(f1,"%s",word);
}
fclose(f1);
// Вывод измененного файла на экран
fseek(f,0,SEEK_SET);
while (1) {