Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание С++ 07_10_08_.doc
Скачиваний:
25
Добавлен:
11.03.2016
Размер:
1.15 Mб
Скачать

Задание 3.3 Ввод и вывод

Ввод и вывод лучше организовать в виде собственного набора функций, интерфейс которого приведен ниже . Это позволит сделать код программы независмым от используемых в реализации функции библиотечных средств ввода вывода. Например, можно использовать стандартную библиотеку языка Си или потоки языка С++

Для функций ввода используем имя input, для функций ввода –output, например

int input(File fp,Record* r) ;

int input(Record* r) ;

void output(File f,Record* r);

voidoutput(Record*r);

Тип Fileопределяется с помощью средстваtypedef

Например

typedefFILE*File;

Функции возвращают 1 при успешном вводе и 0 в случае ошибки или конца файла. Достижение конца файла можно определит при помощи функции

inteof(FILE*fp){returnfeof(fp);}

Для повторного ввода файла необходимо вызвать функцию

void clear(FILE* fp){rewind(fp);}

Для записи и чтения структуры Record из файла проще всего использовать функции блокового ввода вывода стандартной библиотеки языка Си.

Например

int finput(FILE* f, Record* r)

{return fread(r,sizeof(Record),1,f); }

Такой подход имеет существенное преимущество. Поскольку каждая запись будет иметь одинаковый размер, то можно организовать произвольный доступ к любой записи по ее номеру.

Однако для строковых полей это может привести к не экономному расходованию памяти на диске, так как строки реально могут быть значительно меньше, чем объем зарезервированной под них памяти. Кроме того, при использования указателей в качестве полей структур, применение функций блокового ввода вывода теряет смысл. В этом случае наиболее удобны функции форматного ввода вывода.

intfinput(Filef,Record*r)

{

char buf[256];

int state= fscanf(f,"%s%s%d%d%d%d%d\n",

r->autor,buf,&r->number,&r->price,&r->day,&r->month,&r->year);

r->title=new char[strlen (buf)+1] ;

strcpy(r->title, buf);

if(state==7)return 1;

return0;

}

Приведенный способ достаточно прост, но обладает рядом существенных недостатков.

Во-первых, невозможно прекратить ввод пока не будут введены все поля.

Во-вторых, функции ввода стандартной библиотеки языка Си являются функциями низкого уровня, неконтролирующими правильность ввода данных. При несоответствии вводимых данных заданному формату произойдет аварийное завершение программы. Для правильной организации ввода необходимо выдать сообщение об ошибке ввода конкретного элемента и предоставить пользователю возможность повторить ввод.

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

Пример минимального набора функций из интерфейса модуля исключений приводится ниже

exeptions.h

void ExeptionLetters(char* str);

void ExeptionInt(char* str);

void ExeptionFloat(char* str);

void ExeptionRange(double d,double min,double max);

voidExeptionFopen(char*str);

Пример реализации для консольного приложения

#include "exeptions.h"

void ExeptionInt(char* str)

{printf("\nString %s\t must include letters of digits\n",str);}

void ExeptionRange(double d,double min,double max)

{printf("\n Value %f\t must be latter then %f and must be greater then%f\n",d,min,max);}