Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

c++ / Лекция7

.doc
Скачиваний:
101
Добавлен:
02.04.2015
Размер:
69.12 Кб
Скачать

Файлы. Ввод-вывод в стиле С

  • Файловый указатель (file pointer) –это указатель на информацию о файле, включающую его имя, статус, текущее расположение

  • Указатель файла – это указатель на структуру типа FILE, которая определена в файле stdio.h

  • Существует два типа файлов:

    • текстовый (text)- последовательность символов, заканчивающаяся двумя символами: перевод строки и возврат каретки;

    • двоичный (binary)- последовательность байтов.

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

1

FILE fopen (char *filename, char *mode)

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

filename-указатель на имя файла

mode – указатель на строку, содержащую режим

Допустимые значения параметра mode

Назначение

Для текстового файла

Для двоичного файла

Открывает для чтения

“r”

“rb”

Создает для записи

“w”

“wb”

Открывает для записи в конец

“a”

“ab”

Открывает для чтения и записи

“r+”

“r+b”

Создает для чтения и записи

“w+”

“w+b”

Открывает для чтения и записи в конец файла

“a+”

“a+b”

FILE *fp;

if ((fp=fopen(“test”,”r”))= =NULL)

{

операторы обработки ошибки ;

exit(1);

}

NULL – константа в stdlib.h

exit(int val) – функция прекращает выполнение программы, закрывает все открытые файлы и возвращает целое значение val

2

fclose(fp);

Закрывает файл

Возвращает 0- если операция прошла успешно

3

fputc(c, fp );

Выводит символ с в файл

4

char c; // int c

c=fgetc(fp);

Считывает символ из файла

В случае ошибки или достижения конца файла возвращает EOF

5

fgets(s,maxline,fp);

Читает строку в буфер s

s- массив символов

maxline-максимальное число символов

В случае ошибки или достижения конца

возвращает NULL

6

fputs(s,fp);

s- выводимая строка

FILE *fp;

char s[]={"hello"};

char v[10];

for (int i=0;i<10;i++) v[i]='\0';

fp=fopen("test.txt","w");

fputs(s,fp);

fclose(fp);

fp=fopen("test.txt","r");

fgets(v,5,fp);

fclose(fp);

7

fread(ptr,m,n,fp);

считывает из файла в буфер (указатель ptr, адрес) n элементов данных, каждый из которых имеет длину m байт

Функция возвращает количество прочитанных элементов. В случае ошибки или достижения конца возвращает NULL

8

fwrite(ptr,m,n,fp);

Записывает в файл n элементов длиной в m байт из буфера, на который указывает указатель ptr.

Например, указатель может указывать на некоторую структуру.

FILE *fp;

char s[]={"hello"}; // инициализация массива символов

char v[10];

float f=12.23;

fp=fopen("test.dat","wb");// открыть для записи бинарный файл

fwrite(s,sizeof(s),1,fp); // символ & не требуется, т.к. s –указатель на

// начало массива

fwrite(&f, sizeof(float), 1,fp); // символ & обязателен!!!

fclose(fp);

fp=fopen("test.dat","rb");

fread(v,sizeof(v),1,fp); // символ & не требуется, т.к. v –указатель на

// начало массива

fread(&f, sizeof(float), 1,fp); // символ & требуется, т.к. нужен адрес

// переменной f

fclose(fp);

9

fseek(fp,n,m);

(используют для двоичных файлов)

Организация произвольного доступа к данным.

Устанавливает указатель в файле в позицию, отстоящую на n байт от текущей, а направление перемещения (вперед или назад) задается параметром m:

SEEK_SET 0 - с начала файла

SEEK_CUR 1 - с текущей позиции

SEEK_END 2 - с конца файла

10

fprintf(fp, форматы, arg1,…,argn);

Выводит данные в файл, преобразует в форматы и записывает их в файл

11

fscanf(fp,форматы, &arg1,...,&argn);

Вводит данные из файла , преобразует в форматы и записывает в переменные arg1,…,argn

FILE *fp;

float f=12.23;

int m=7;

char s[]={"Hello"};

char v[10];

fp=fopen("test.dat","w");

fprintf(fp,"%f\n",f);

fprintf(fp,"%d\n",m);

fprintf(fp,"%s\n",s);

fclose(fp);

fp=fopen("test.dat","r");

fscanf(fp,"%f\n",&f);

fscanf(fp,"%d\n",&m);

fscanf(fp,"%s\n",v);

fclose(fp);

12

remove(полное имя файла)

Удаление файла. Перед удалением файл должен быть закрыт

remove(“text.dat”);

При нормальном завершении возвращает 0.

При ошибке можно анализировать глобальную переменную errno, определенную в stdlib.h.

#include <stdlib.h>

if (remove("test.txt")!=0) printf("%d",errno);

13

rewind(fp)

Перемещает индикатор позиции файла в начало

14

feof(fp)

Проверка достижения конца файла

Возвращает ненулевое значение, если достигнут конец файла.

while(!feof(fp)) ch=fgetc(fp);

Пример

// Из текстового файла переписать информацию в бинарный файл

//---------------------------------------------------------------------------

Пример текстового файла

Toshiba 400 432 Очень хороший

Samsung 300 340 хороший

LG 250 280 средний

С 20 –ой позиции – цена оптовая, с 25 – розничная, с 30-ой –комментарий ; Начальная позиция 0

#include <iostream.h> //для использования cout, cin

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

int main()

{

FILE *fi,*fo;

if ((fi=fopen("file.txt", "r"))= =0)

{

cout << "error open" <<endl;

getch();

return 1;

}

if ((fo=fopen("binfile.out", "wb"))= =0)

{

cout << "error write" <<endl;

getch();

return 1;

}

const int dl=80;

char s[dl]; // массив символов

struct { // объявление типа одной структуры

char type[20]; //тип монитора-19символов название +1 символ \0

int opt,rozn; // оптовая и розничная цены

char comm[40]; // примечание

}mon; // объект структуры

int kol=0; // количество записей в файле

while (fgets(s,dl,fi)) // заполнение полей структуры

{

strncpy(mon.type,s,19); // подключена библ. string.h-копирование

// n=19 байт

mon.type[19]='\0'; //завершение нулевым байтом

mon.opt=atoi(&s[20]);//функция atoi пропускает пробелы и //табуляции в начале строки, преобразование прекращается при //встрече недопустимого символа

// функция atof преобразует строку в вещественное значение

mon.rozn=atoi(&s[25]);

strncpy(mon.comm,&s[30],40);

fwrite(&mon,sizeof (mon),1,fo);

kol++;

}

fclose(fi); fсlose(fo);

fo=fopen("binfile.out", "r")

int i;

cin>>i; // запрос новой записи (записи начинаются с 0 )

if (i>=kol)

{

cout <<"No ";

getch();

return 1;

}

fseek(fo,(sizeof (mon))*i, SEEK_SET);//прямой доступ от начала //файла

fread(&mon,(sizeof mon),1,fo);

cout<<"type "<< mon.type<<"opt "<<mon.opt

<< "rozn "<<mon.rozn<<endl;

fclose(fo);

getch();

}

Для Windows-приложений

Компонент OpenDialog (закладка Dialogs)

Свойство

Описание

DefaultExt

Определяет значение расширения файла по умолчанию.

Тип string, содержит расширение, добавляемое к имени файла, если у него не указано расширение. Содержит до 3-х символов и не включает разделительную точку

FileName

Содержит имя файла, которое помещено в строке File Name: диалогового окна

Filter

Маска *.dat означает что, будут видны файлы данных с любым именем и с расширением dat, а маска *.* - что будут видны все файлы (с любым именем и с любым расширением).

InitialDir

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

Title

Заголовок диалогового окна

Компонент SaveDialog (закладка Dialogs)

Пример применения SaveDialog1

FILE *fo;

AnsiString name1;

if (SaveDialog1->Execute())

name1=SaveDialog1->FileName);// присвоение имени

fo=fopen(name1.c_str(),"wb");

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

{

strcpy(mon.s,StringGrid1->Cells[0][i].c_str());

mon.num=StrToInt(StringGrid1->Cells[1][i]);

fwrite(&mon,sizeof(mon),1,fo);

}

fclose(fo);

Пример применения OpenDialog1

if (OpenDialog1->Execute())

{

name1= OpenDialog1->FileName.c_str();

}