Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
29.04.2018
Размер:
824.83 Кб
Скачать

Void main()

{ setlocale(LC_CTYPE, "Russian");

int i, d, m, y;

for(i = 0; i < 2; i++) //2 сотрудника

{ cout<< endl<<"Фамилия:"<<endl;

cin>>S[i].Name;

cout<<"Номер отдела: "<<endl;

cin>>S[i].Dep;

cout<<"День найма:"<<endl;

cin>>d;

S[i].Priem.nDay = d;

cout<<"Месяц найма:"<<endl;

cin>>m;

S[i].Priem.nMonth = m;

cout<<"Год найма:"<<endl;

cin>>y;

S[i].Priem.nYear = y;

cout<<endl;

cout<<"Сотрудник: "<<S[i].Name <<endl;

int n = S[i].Dep;

cout<<"Отдел:"<<NameDep(n)<<endl;

cout<<"Дата найма: "<<S[i].Priem.nDay << "."<<S[i].Priem.nMonth<<"."<<

S[i].Priem.nYear<<endl;

}

}

Файловый ввод/вывод

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки как единое целое.  

Работа с файлами на языке С

Текстовые файлы (последовательного доступа) - последовательность ASCII символов

Бинарные файлы (двоичные, произвольного доступа) - структура определяется программно.

Каждый файл завершается маркером конца файла (end-of-file marker или EOF) или указанным числом байтов, записанным в служебную структуру данных поддерживающей системы.

Когда файл открывается, то создается объект (структурированная переменная, содержащая информацию о файле) и с этим объектом связывается файловый поток.

Файловый поток – это файл вместе с предоставленными средствами буферизации.

Потоки можно:

  • открывать и закрывать;

  • вводить и выводить строки, символы, форматированные данные, порции данных произвольной длины;

  • анализировать ошибки ввода/вывода и достижения конца файла;

  • управлять буферизацией потока и размером буфера;

  • получать и устанавливать указатель текущей позиции в файле.

Прежде чем начать работать с потоком, его надо инициировать (открыть).

При этом поток связывается со структурой FILE, определение которой находится в библиотечном файле <stdio.h>.

В структуре FILE находится указатель на буфер, указатель на текущую позицию файла и т.п.

type struct

{ short level; //число оставшихся в буфере непрочит. байт (размер буфера 512 байт)

unsigned flags; //флаг статуса файла: чтение, запись, дополн.

char fd; //дескриптор (номер) файла

unsigned char hold; //непереданный символ

short bsize; //размер внутр. промежут. буфера

unsigned char buffer; //знач. указателя для доступа внутри буфера

unsigned char *curp; // тек. знач. указат. для доступа внутри буфера

unsigned istemp; //флаг временного файла

short token; //флаг при работе с файлом

} FILE;

Для открытия файла используется функция

fopen(<имя_файла>, <режим_открытия>)

 

При открытии потока возвращается указатель на поток, т.е. на объект типа FILE:

#include <stdio.h>

Int main()

{ …………

FILE *fp; //дескриптор

………

fp = fopen(“t.txt”, ”r”);

………

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

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

F:\p1\p2\a.txt

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

Режим

Описание

w

открыть файл для записи (если файл сущ., то он стирается)

r

открыть файл для чтения

a

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

w+

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

r+

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

a+

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

 

Поток можно открыть в текстовом (t) или двоичном (b) режиме.  По умолчанию устанавливается текстовый режим.

В явном виде режим указывается следующим образом: ”r+b” или ”rb” – двоичный (бинарный) режим.

Если открытия файла не произошло, то функция fopen вернет NULL.

После работы с файлом его надо закрыть с помощью функции: 

fclose ( <указатель на поток> );

Она разрывает связь структурированной переменной с файлом и записывает в память оставшееся содержимое буфера.

Пример

#include <stdio.h>

……………….

FILE *fd;

fd = fopen("aaa.txt", "r");

if (fd == NULL)

printf("Файл не открыт\n");

else

{ fscanf(fd, ....);

. . . . . . . . . . . . . .

fclose(fd);

}

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

В новых версиях Visual Studio надо использовать функцию, общий вид которой:

fopen_s( FILE** pFile, const char *filename, const char *mode)

Здесь pFile  указатель на файловый указатель, filename  имя файла, mode  режим открытия файла.

Для закрытия нескольких файлов введена функция:   void fcloseall(void);

Для этого используют станд. функцию: FILE *freopen(char*имя_файла, char *режим,  FILE *дескриптор_файла);

Эта функция сначала закрывает файл, объявленный дескриптором (как это делает функция fopen), а затем открывает файл с именем_файла и правами доступа . 

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

Ввод-вывод:

форматированный – fscanf, fprintf;

построчный – fgets, fputs;

посимвольный – fgetс, fputс;

блоками – fread, fwrite

Форматированный ввод-вывод

int fscanf (FILE *f, char *формат, список адресов объектов) //считывание

int fprintf (FILE *f, char *формат, список объектов) //запись

Пример

#include <iostream>

#include <stdio.h>

using namespace std;

Соседние файлы в папке Лекции