
c++ / Лекция7
.docФайлы. Ввод-вывод в стиле С
|
Функции для работы с файлами
№ |
|
|
||||
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 |
Заголовок диалогового окна |
Пример применения 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();
}