Управление текущим процессом
Функции объявлены в файлах process.h, stdlib.h. void _с_exit/(void) ‑ выполняет все действия, аналогичные функции exit, по закрытию файлов и очистке буферов, но не вызывает функций окончания и не прерывает выполнение программы. Void _cexit(void) ‑ выполняет все действия, аналогичные функции exit, по закрытию файлов, очистке буферов и вызову функций окончания, но не прерывает выполнение программы. void _exit(int status) ‑ завершает выполнение программы, но в отличие от exit не сбрасывает буферы, не закрывает файлы и не вызывает функции окончания; status ‑ устанавливаемый код завершения. void abort(void) ‑ аварийное завершение программы. void exit(int status) ‑ завершает выполнение программы, закрывая все открытые файлы, сбрасывая выходные буферы в соответствующие потоки и вызывая все зарегистрированные функцией atexit функции окончания; status ‑ устанавливаемый код завершения. Запуск из приложения внешних программ Функции объявлены в файлах process.h, stdlib.h, stdio.h int execl(char *path, char *arg0, *argl,..., *argn, NULL) ‑ выполняет порожденный процесс path с аргументами arg0 - argn. int execle(char *path, char *arg0, *argl,..., *argn, NULL, char **env - выполняет порожденный процесс path с аргументами arg0 - argn и с окружением env. int execlp(char *path, char *arg0,*argl,..., *argn, NULL) ‑ выполняет порожденный процесс path с аргументами arg0 ‑ argn, с поиском в PATH. Пример вызова редактора Word: execlp («Winword», «Winword», «Delphi.doc»,NULL) int execlpe(char *path, char *arg0, *argl,..., *argn, NULL, char **env) - выполняет порожденный процесс path с аргументами arg0 ‑ argn, с поиском в PATH и с окружением env. int execv(char *path, char *argv[]) ‑ выполняет порожденный процесс path с аргументами argv[]. int execvp(char *path, char *argv[]) ‑ выполняет порожденный процесс path с аргументами argv[], с поиском в PATH. int system(const char *command) ‑ выполняет команду command операционной системы и возвращается в приложение.
Работа с файлами Файлы в С Состав файла задается структурой FILE. В начале работы стандартный файл ввода stdin приписывается клавиатуре, а стандартный файл вывода stdout - экрану дисплея. Перед обработкой файла он объявляется и затем открывается, а после обработки ‑ закрывается. Файлы бывают следующих типов: текстовый ‑ состоит из последовательности символов, разбитой на строки. Для деления на строки используется управляющий символ ‘\n’. Для работы с текстовыми файлами удобно работать специальными методами загрузки (LoadFromFile) и сохранения (SaveToFile); двоичный - это последовательность значений типа char. Символ EOF в операциях ввода/вывода служит для обозначения и проверки конца файла или возникновения ошибки ввода/вывода. Функции открытия и закрытия файлов FILE *fopen(char *filename, char *type) - открытие файла. В качестве первого аргумента передается имя файла. Второй аргумент определяет тип открываемого файла: r - открыть уже существующий файл на ввод; w - создать новый файл или очистить уже существующий файл и открыть его на вывод; а - создать новый файл для вывода или осуществить вывод в конец уже существующего файла; r+ - открыть существующий файл для обновления с начала файла; w+ - создать новый или очистить существующий файл для обновления его содержимого; а+ - создать новый файл или подстроиться в конец существующего файла для обновления его содержимого. Дополнительно к каждой из приведенных строк можно добавить символ b - открывается двоичный файл. Функция fopen возвращает указатель (файловая переменная) на структуру FILE, описывающую файл. Если при открытии файла произошли какие-либо ошибки, то в глобальную переменную еrrnо будет записан код (номер) ошибки, и будет возвращен нулевой (0) указатель. int fclose (FILE *file) - файл закрывается. Если закрытие выполняется правильно, то возвращается 0, иначе ‑ EOF;
void rewind (FILE *file) ‑ указатель файла перемещается в начало файла. Функции ввода Int fgetc(FILE *file) -из указанного входного файла считывается очередной символ, и его значение переводится в тип int. Если при считывании обнаруживается ошибка или достигается конец файла, то возвращается значение EOF. Int getchar() -из стандартного входного файла stdin считывается очередной символ, и его значение переводится в тип int. Int getch() - аналогична getchar, но не требует нажатия клавиши после ввода символа и останавливает работу программы до нажатия клавиши. Эта функция используется для ввода односимвольного ответа. int fseek(FILE *file, long offset, Int wherefrom) -служит для произвольного доступа к символам, обычно внутри двоичных файлов. Первый аргумент задает имя файла Второй аргумент offset является длинным целым числом со знаком и указывает число байтов смещения от точки, определяемой третьим параметром функции. Третий аргумент wherefrom указывает точку, от которой следует начинать отсчет смещения: от начала файла (0), текущей позиции файла (1), от конца файла (2). char *fgets(char *s, Int n, FILE *file) -в строку s считываются символы до тех пор, пока не будет выполнено первым одно из условий: начнется новая строка, достигнут конец файла или прочитано n-1 символов. После того как из входного файла в строку s будут прочитаны символы, строка дополняется ноль‑символом (признак конца строки). Если операция считывания прошла успешно, то возвращается адрес строки s, иначе ‑ нуль. char *gets(char *s) -выполняется считывание символов из стандартного входного файла stdin. Если входной файл прерывается символом перехода на новую строку ‘ \n ’, то этот символ не попадает в строку s. Int fread(void *ptr, unsigned elem_size, int count, FILE *file) -из входного файла считываются и по адресу *ptr записываются не более чем количество count элементов размером elem_size байтов каждый. Функция возвращает число фактически считанных элементов. Int feof(FILE *file) -если при чтении из указанного файла достигнут конец файла (попытка прочитать символ за пределами файла), то возвращается ненулевое значение, иначе - нулевое значение. int scanf Ошибка! Закладка не определена. (char *fornat, <дополнительные аргументы>);
int fscanf(FILE *strea», char *format,< дополнительные аргументы>); int sscanf(char *string, char *fогmаt,< дополнительные аргументы>); int cscanf(char *format, <дополнительные аргументы>); Все функции семейства scanf вводят поля символ за символом, переводя их в соответствии с указанным форматом. Функцией scanf осуществляется ввод из стандартного файла stdin. Функция fscanf может вводить из файла, указанного пользователем. Функция sscanf вводит из заданной строки. Функция cscanf вводит с консоли. Первое.вводимое поле преобразуется в соответствии со спецификацией формата, и полученное значение заносится по адресу первого аргумента. Следующее поле переводится в соответствии со второй спецификацией формата и т.д. Спецификация формата аналогична спецификации формата для семейства функций printf (п. 6.2.4). Поля ввода определяются по следующим правилам: группа символов до (но не включая) символа - разделителя; группа символов до такого символа, который не может быть преобразован в соответствии с текущей спецификацией; группа из n символов, где n - указатель ширины поля. Функции вывода 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 (очистка ostream), 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 (создание файла; если он уже существует, то открыть его для записи), fmOpenRead (открыть файл для чтения), fmOpenWrite (открыть файл для записи с полной заменой текущего содержания), fmShareExclusive/fmShareDenyNone (монопольное/коллективное использование файла), 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. Объектно‑ориентированное программирование
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|