Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функции обработки ошибок




Функции вывода

Int fflush(FILE *file) -служит для выталкивания каждого внутреннего бу­­фера на соответствующее устройство. После вызова функции файл остается открытым. Если при выполнении функции появятся ошибки, то будет возвращено значение EOF, иначе - 0.

Int fputc(char ch, FILE *file) - символ ch записывается в указанный выход­ной файл. Если запись прошла успешно, то возвращается значение ch.

int putchar(char ch) -действует аналогично функции fputc, но записывает символ ch в стандартный выходной файл stdout.

Int fputs(char *s, FILE *file) -строка s, ограниченная ноль-символом, переписывается в выходной файл, причем ноль-символ отбрасывается. Если при переписи возникает ошибка, то возвращается значе­ние EOF, в противном случае возвращается ненулевое зна­чение.

Int puts(char *s) -функция аналогична функции fputs, за исключением того, что символы переписываются в стандартный файл stdout, и строка s дополняется ноль‑символом конца строки.

Int fwrite(void *ptr, unsigned elem_size,Int count,FILE <stream>) -начиная с адреса ptr, считывается не более чем количество count элементов размером elem_size байтов каждый, и эти элементы записываются в вы­ход­ной файл. Функция возвращает число фактически записанных элементов.

Int fprintf(FILE *stream,char *format,< список выводимых значений>);

Int printf(char *format,<список выводимых значений>);

Int sprintf(char *s, char *foramt, < список выводимых значений>);

Int cprintf(char *format, < список выводимых значений>);

С помощью этих функций выполняется форматный вывод соот­ветственно в: выход­ной файл (fprintf), в стандартный выходной файл stdout (fprintf), ука­зан­ную строку (sprintf) или на терминал (cprintf). Функции возвращают число символов, переданных по назначе­нию.

Строка формата (char *format) задает редактирование данных (п. 6.2.5).

Int ferror(FILE *file) -возвращает нулевое значение, если последняя операция ввода/вывода с указанным файлом закончилась успешно, иначе ‑ нену­ле­вое значение.

void clearerr(FILE *file) -устанавливается в нуль состояние признака ошибки в указанном файле.

Пример программы создания справочника товара spravtov.txt

int main(int argc, char **argv) // основная функция

{ struct {int kt; char nt [20];} zstovar; // объявление переменной-записи

FILE *nf; // объявление файловой переменной nf*

if ((nf=fopen(«spravtov.txt»,»w»))==0) // проверка открытия spravtov.txt

{puts («Ошибка при открытии файла spravtov.txt»); return EOF;} // выход while (1) // начало бесконечного цикла ввода данных

{printf(«\nКод товара(0-выход)?»); scanf(«%d»,&zstovar.kt); // ввод if (zstovar.kt<=0||zstovar.kt>10) break; // выход из цикла ввода

printf(«\n Название товара?»); scanf(«%s»,&zstovar.nt); // ввод fseek(nf,(zstovar.kt-1)*sizeof(zstovar),0);// установка на запись с номером=kt

fwrite(&zstovar,sizeof(zstovar),1,nf); // вывод записи zstovar в файл spravtov

} /* конец тела цикла */ fclose(nf); // закрытие файла spravtov.txt

} // конец тела основной функции

6.5.2. Файлы в С++

При работе с файлами (#include <fstream.h>) используются поточные клас­сы ifstream (чте­ние), ofstream (запись), fstream (чтение и запись). Описание потоков приводится в файле Cbuilder5 \ Help\IOS&CR.DOC.

Перед открытием файла следует создать поточный объект в виде: <имя класса> <имя объекта>. В консольных при­ло­жениях поточные объекты под именами cout и cin задают стандартный вы­вод на экран и ввод с клавиатуры и не требуют сво­его создания, откры­тия и закрытия и могут быть переопределены в коман­д­ной строке на файлы. Открытие файла выполняется отдельно методом open (<имя файла>,<режимы>) или сразу при создании поточного объекта (ofstream file(«Tovari.txt»);).

Режимы задаются в виде: ios:: <режим>| ios:: <режим>| ios:: <режим>...

Перечислим основные режимы: in (ввод), out (вывод), binary (бинарный файл), app (дозапись в конец файла), ate (установить указатель в конец файла), trunc (очистка файла).

Пример открытия файла на запись и его закрытия:

ofstream file; file.open(«Tovari.txt», ios::out|ios::app); file.close();

Операторы включения (<<) и извлечения (>>) записывают и чи­тают данные из файла. Опера­тор извлечения останавливается на первом символе-разделителе (сим­волы про­бела, табуляции и новой строки). Таким образом нельзя ввести зна­че­ние из нескольких слов в отличие от мето­да getline. В данных опе­раторах можно использовать модификаторы для форматирования дан­ных (#include <iomanip.h>): endl/ends (вставка символа новой/конца строки), dec/hex/oct (перевод в десятич­ное/шес­т­над­цати­рич­ное/вось­меричное чис­ло), ws (извлечение про­белов), flush (очистка ost­ream), setfill(‘<символ>’) (установка символа заполните­ля), setprecision(n) (точ­ность вещественных чисел в n разрядов), setw(n) (ши­рина поля n).

Основные методы класса ofstream: open (открытие), put (запись сим­вола), write (запись заданного числа символов), seekp (установка ука­за­те­ля на нужный байт), tellp (возвращает значение указателя), close (за­кры­тие). Основные методы класса ifstream: open (открытие), get (чтение), getline (чтение строки), read (чтение заданного числа байтов), eof (true, достигнут конец файла), peek (выдает очередной символ, но не выбирает его), seekg (установка указателя на нужный байт), tellg (возвращает значение указателя), close (закрытие).

Пример создания текстового файла «Tovari.txt»:

int main(int argc, char **argv) {

ofstream file («Tovari.txt»); //создание объекта file и открытие файла

file << «мука рисовая» << endl << 1 << endl << 5.4 << endl; // вывод в файл

file <<«сахар тростниковый»<<endl<<2<<endl<<10.1<<endl;//вывод в файл

file.close(); /* закрытие файла*/ }

Пример чтения текстового файла «Tovari.txt»:

int main(int argc, char **argv) {

ifstream file(«Tovari.txt»); // создание объекта file и открытие файла

if (!file) return EOF; // ошибка при открытии файла

char nt[40]; int kod=0, i=0; float cena; // объявление переменных

while (!file.getline(nt,sizeof(nt)).eof()) // цикл чтения файла

{file>>kod>>cena>>ws;//чтение в переменные kod и cena, пропуск пробелов

cout << nt << endl << kod <<endl << cena << endl; // вывод на экран

}file.close(); getch(); /* закрытие файла*/ }

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

Пример программы создания справочника товара spravtov (п.6.5.1):

int main(int argc, char **argv) {

struct {int kt; char nt [20];} zstovar; // объявление переменной-записи

ofstream file(«spravtov.txt»,ios::binary); // создание объекта file и открытие

if (!file) {puts («Ошибка при открытии файла spravtov.txt»); return EOF;} while (1) // начало бесконечного цикла ввода данных

{cout <<«\nКод товара(0-выход)?»; cin >> zstovar.kt; // ввод код товара в kt

if (zstovar.kt<=0 || zstovar.kt>10) break; // выход из цикла ввода

cout << «Название товара? «; cin >> zstovar.nt; // ввод наименования товара

file.write((char*)&zstovar,sizeof(zstovar)); // вывод записи zstovar в spravtov

} /* конец тела цикла */ file.close(); // закрытие файла spravtov.txt

ifstream infile(«spravtov.txt»,ios::binary); // открытие файла для чтения

while(!infile.read((char*)&zstovar,sizeof(zstovar)).eof())//цикл чтения записей

cout << zstovar.kt << ««<< zstovar.nt << endl; // вывод полей kt и nt

infile.close(); getch(); /* закрытие файла spravtov.txt */ }

Произвольный доступ к файлу осуществляется методом seekg (при чтении записи) или метод seekp (при замене записи) с параметром, ко­то­рый указывает порядковый номер байта устанавливаемой позиции (указателя) фай­­ла (отсчет начинается с нуля). Следующие методы чтения / за­писи будут читать/записывать, начиная с этой позиции файла.

Пример чтения записи под номером 2 из файла spravtov.txt:

int main(int argc, char **argv) {

struct {int kt; char nt [20];} zstovar; // объявление переменной-записи

ifstream infile(«spravtov.txt»,ios::binary); // открытие файла для чтения

infile.seekg(1*sizeof(zstovar));//установка указателя на начало 2-й записи

infile.read((char*)&zstovar,sizeof(zstovar)); // чтение второй записи

cout << zstovar.kt << ««<< zstovar.nt << endl; // вывод полей kt и nt 2-й зап.

infile.close(); getch(); /* закрытие файла spravtov.txt */ }

6.5.3. Файлы в С++Builder

Для ввода/вывода файлов используется компонентный класс TFileStream, который частично включает в себя поточные классы С++. Поэ­тому эти два способа работы с файлами совместимы (методы С++ бо­лее быстрые при работе). Достоинством класса TFileStream является ис­поль­зование механизма исключения для обработки ошибок ввода/выво­да.

Основые свойства класса TFileStream: Position (текущее значение позиции файла; оно доступно для чтения и записи), Size (размер файла).

Основые методы класса TFileStream: TFileStream (конструктор открывает файл в нужном режиме), CopyFrom (копирует заданное число бай­тов из другого потока в данный), Read/Write (вводит/выводит заданное чис­ло байтов и возвращает число фактически введенных/выведенных сим­во­лов), Seek (перемещает указатель файла в нужную позицию отно­си­тельно начала, конца или текущего указателя файла), delete (закры­ва­ет файл). Открытие файла осуществляется в виде:

TFileStream* <имя объекта> = new TFileStream(<имя файла>,<режимы>);

Режимы открытия файла: FmCreate (создание файла; если он уже су­щест­вует, то открыть его для записи), fmOpen­Read (открыть файл для чтения), fmOpenWrite (открыть файл для записи с полной заменой теку­ще­го содер­жа­ния), fmShareExclusive/fmShareDeny­No­ne (монопольное/кол­лек­тив­ное ис­поль­зование файла), fmShareDenyWrite/fmShareDenyRead (ко­л­­­лективное использование фай­ла по чтению/записи).

Пример. Разместим на форме кнопку Button1 и объект Memo1. Сос­тавим процедуру обработки события Click для этой кнопки:

void __fastcall TForm1::Button1Click(TObject *Sender) // процедура

{ struct stovar{int kt; char nt [20];} zstovar; // объявление переменной-записи

char str[30]; // создадим далее объект file и откроем создаваемый файл

TFileStream* file = new TFileStream(«spravtov.txt»,fmCreate); // открытие

stovar zst1={1, «масло крестьянское»}; // значения полей первой записи zst1

stovar zst2={2, «масло подсолнечное»};// значения полей второй записи zst2

file->Position=(zst1.kt-1)*sizeof(zst1); // установка на запись под номером kt

file->Write(&zst1,sizeof(zst1));//вывод записи zst1 под номером kt в spravtov

file->Position=(zst2.kt-1)*sizeof(zst2); // установка на запись под номером kt

file->Write(&zst2,sizeof(zst2));//вывод записи zst2 под номером kt в spravtov

delete file; // удаление объекта file c закрытием файла spravtov.txt

//создание объекта infile и открытие файла spravtov.txt для чтения

TFileStream* infile = new TFileStream(«spravtov.txt»,fmOpenRead);

Memo1->Clear(); // очистка объекта Memo1

while(infile->Read(&zstovar,sizeof(zstovar))>0) // цикл чтения записей

{ sprintf(str,»код: %d товар: %s»,zstovar.kt,zstovar.nt); // формирование str

Memo1->Lines->Add(str); // добавление строки str в массив строк Memo1

}delete infile; /*удаление объекта infile c закрытием файла spravtov.txt*/ }

6.6. Объектно‑ориентированное программирование




Поделиться с друзьями:


Дата добавления: 2014-12-08; Просмотров: 474; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.