Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_Файлы.doc
Скачиваний:
25
Добавлен:
11.05.2015
Размер:
140.8 Кб
Скачать

File *fl;

void fsr();

void fsw();

int main()

{

fsr(); // Запись в файл

fsw(); // Чтение из файла

return 0;

}

void fsr()

{

if ((fl = fopen("lab2.dat","w"))==NULL)

{

cout << "Oshibka pri sozdanii"<<endl;

exit(1);

}

cout << "Vvedite sytoki" << endl;

char str[80];

do {

gets(str);

strcat(str, "\n"); // добавление разделителя строк

fputs(str, fl);

} while(*str!='\n');

fclose(fl);

}

void fsw()

{

if ((fl = fopen("lab2.dat","r"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

char str[80];

while(!feof(fl))

{

if( fgets( str, 100, fl ) != NULL) cout << str;

}

fclose(fl);

}

Кроме основных функций ввода/вывода, также часто используются функции fprintf() и fscanf().

Функция

int *fprintf(FILE * указатель_на _файл,

const char * управляющая_строка);

записывает форматированные данные в файл. Управляющая_строкаопределяет строку форматирования аргументов, заданных своими адресами. Обычно эта строка состоит из последовательности символов “%”, после которых следует символ типа данных:

I или i

Десятичное, восьмеричное или шестнадцатеричное целое

D или d

Десятичное целое

U или u

Десятичное целое без знака

E или e

Действительное с плавающей точкой

s

Строка символов

c

Символ

Функция

Int *fscanf(file * указатель_на _файл,

const char * управляющая_строка);

читает форматированные данные из файла. Строка форматирования строится аналогично функции fprintf.

Следует обратить внимание на то, что при чтении данных всегда указываются адреса переменных (&), а не сами переменные.

ПримерЗапись и чтение данных из файла.

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

FILE *fl;

double v; char st[81]; int n; char ch;

void fpr();

void fpw();

int main()

{

fpr(); // Запись в файл

fpw(); // Чтение из файла

return 0;

}

void fpr()

{

if ((fl = fopen("lab2.dat","w"))==NULL)

{

cout << "Oshibka pri sozdanii"<<endl;

exit(1);

}

v=3.14;

n=298;

fprintf( fl,"%s %e %d %c", "string",v,n,'x');

fclose(fl);

}

void fpw()

{

if ((fl = fopen("lab2.dat","r"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

fscanf(fl,"%s %e %d %c",st,&v,&n,&ch);

cout << st << endl;

cout << v << endl;

cout << n << endl;

cout << ch << endl;

fclose(fl);

}

Функция

void rewind(FILE * указатель_на _файл);

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

Функция

int ferror(FILE * указатель_на _файл);

определяет, произошла ли ошибка во время работы с файлом. Она возвращает ненулевое значение (true), если при последней операции с файлом произошла ошибка; в противном же случае она возвращает 0 (false).

Функция

size_t fwrite(const void *записываемое_данное,

size_t размер_элемента, size_tчисло_элементов,

FILE *указатель_на _файл);

записывает в файл заданное число данных заданного размера. Размер данных задается в байтах. Тип size_t определяется как целое без знака. Функция возвращает число записанных элементов. Если число записанных элементов не равно заданному, то возникла ошибка.

Функция

size_t fread(void * считываемое_данное,

size_t размер_элемента, size_tчисло_элементов,

FILE *указатель_на _файл);

считывает в указанное данное заданное число данных заданного размера. Размер данных задается в байтах. Функция возвращает число прочитанных элементов. Если число записанных элементов не равно заданному, то возникла ошибка.

Функции fread() и fwrite() при открытии файла для работы с двоичными данными могут работать с информацией любого типа.

Функция

int fileno(FILE * указатель_на _файл);

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

Функция

long filelength(int дескриптор);

возвращает длину файла с соответствующим дескриптором в байтах.

Функция

int chsize(intдескриптор, longразмер);

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

Функция

long ftell(FILE * указатель_на _файл);

возвращает значение указателя на текущую позицию файла.

Функция

int fgetpos(FILE *stream, fpos_t *позиция);

определяет значение текущей позиции файла.

Функция

int fseek(FILE * указатель_на _файл, long int число_байт, int точка_отсчета);

устанавливает указатель в заданную позицию. Заданное количество байт отсчитывается от начала отсчета , которое задается следующими макросами: начало файла – SEEK_SET, текущая позиция – SEEK_CUR, конец файла – SEEK_END. При успешном завершении работы функция возвращает нуль, а в случае ошибки — ненулевое значение.

Пример: Открыть файл и записывать туда все вводимые с клавиатуры числа, до тех пор, пока не будет введено число -1. Отсортировать данные в файле по возрастанию.

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

#include <io.h>

FILE *fl;

void fbr();

void fbsort();

void fbw();

int main()

{

fbr(); // Запись в файл

fbsort(); // Сортировка в файле

fbw(); // Чтение из файла

return 0;

}

void fbr()

{

if ((fl = fopen("lab2.dat","wb"))==NULL)

{

cout << "Oshibka pri sozdanii"<<endl;

exit(1);

}

int a;

do {

cin >> a;

int nwrt = fwrite( &a, sizeof(int), 1, fl );

} while (a != -1);

fclose(fl);

}

void fbsort()

{

if ((fl = fopen("lab2.dat","rb+"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

int nb =sizeof(int), a, b, nwrt;

int n=filelength(fileno(fl))/nb;

for (int i=0; i<n-1; i++)

for (int j=i+1; j<n; j++)

{

fseek(fl ,i*nb , SEEK_SET); nwrt = fread( &a, nb, 1, fl );

fseek(fl ,j*nb , SEEK_SET); nwrt = fread( &b, nb, 1, fl );

if (a>b)

{

fseek(fl ,i*nb , SEEK_SET); nwrt = fwrite( &b, nb, 1, fl );

fseek(fl ,j*nb , SEEK_SET); nwrt = fwrite( &a, nb, 1, fl );

}

}

fclose(fl);

}

void fbw()

{

if ((fl = fopen("lab2.dat","rb"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

int a;

while(true)

{

int nwrt = fread( &a, sizeof(int), 1, fl );

if (nwrt!=1) break;

cout << a << " ";

}

fclose(fl);

}

12

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]