Рефераты. Теория вычислительных процессов и структур

Целочисленные форматы:


%d - общеупотребительный код формата для значений типа int. Если значение является отрицательным, то будет автоматически добавлен знак минуса;

%u - тип unsigned int, выводится в десятичной форме;

%o - тип unsigned int, выводится как восьмеричное число без знака;

%x - тип unsigned int, выводится как шестнадцатеричное число без знака;

%ld - тип long со знаком, выводится в десятичной форме.

Можно также использовать спецификации %lo, %lu, %x.

Форматы вещественных чисел:


%f - тип float или double, выводится в стандартной десятичной форме;

%е - тип float или double, выводится в экспоненциальной форме (для обозначения экспоненты будет использоваться символ е);

%g - объединение спецификаций %e и %f - аргумент имеет тип float или double в зависимости от величины числа, оно будет выводиться либо в обычном формате, либо в формате экспоненциальной записи.

Форматирование строк и символов:

%c - тип char, выводится без изменений, даже если является «непечатаемым» символом (численное значение символа можно вывести, используя код формата для целых чисел, это может понадобиться при невозможности отображения символа на терминале);

%s - соответствующий аргумент считается строкой ( указателем на массив символов). Содержимое строки передаётся дословно в выходной поток, строка должна заканчиваться нулевым символом.

Спецификации формата могут также включать информацию о минимальной ширине поля, в котором выводится аргумент, и точности. В случае целочисленного аргумента под точностью понимается максимальное число выводимых цифр. Если аргумент имеет тип float или double, то точность задаёт число цифр после десятичной точки. Для строчного аргумента этот параметр определяет число символов, которые будут взяты из строки. Например, могут использоваться такие записи: %10.5d;    %.5f;    %10s;    %-30s.

Функция fprintf может использоваться для вывода диагностических ошибок:


#include <stdio.h>

#include <stdlib.h>

int notfound (const char *progname, const char *filename)

{ fprintf (stderr, “%s: файл %s не найден\n”,progname, filename);

   exit (1); }


Для опроса состояния структуры FILE существует ряд простых функций. Одна из них - функция feof:

#include <stdio.h>

int feof (FILE *stream);

Функция feof является предикатом, возвращающим ненулевое значение, если для потока stream достигнут конец файла. Возврат нулевого значения просто означает, что этого ещё не произошло.

Функция main:

int main( int argc , char *argv[ ] [, char *envp[ ] ] );

Данное объявление позволяет удобно передавать аргументы командной строки и переменные окружения. Определение аргументов:

argc - количество аргументов, которые содержатся в argv[] (всегда больше либо равен 1);

argv - в массиве строки представляют собой параметры из командной строки, введенные пользователем программы. По соглашению, argv [0] – это команда, которой была запущена программа, argv[1] – первый параметр из командной строки и так далее до argv [argc] – элемент, всегда равный NULL;

envp - массив envp общее расширение, существующее во многих UNIX® системах. Это массив строк, которые представляют собой переменные окружения. Массив заканчивается значением NULL.

Следующий пример показывает, как использовать argc, argv и envp в функции main:

#include <iostream.h>

#include <string.h>

void main( int argc, char * argv [], char *envp[] )

{

   int iNumberLines = 0;    /* По умолчанию нет аргументов */

   if( argc == 2 && strcmp(argv[1], "/n" ) == 0 )

       iNumberLines = 1;

   /* Проходим список строк пока не  NULL */

   for( int i = 0; envp[i] != NULL; ++i )

   {

       if( iNumberLines )

           cout << i << ": " << envp[i] << "\n";

   }

}

 

Для работы с каталогами существуют системные вызовы:

       int mkdir (const char *pathname, mode_t mode) – создание нового каталога,

       int rmdir(const char *pathname) – удаление каталога.

Первый параметр – имя создаваемого каталога, второй – права доступа:

       retval=mkdir(“/home/s1/t12/alex”,0777);

       retval=rmdir(“/home/s1/t12/alex”);

Заметим, что вызов rmdir(“/home/s1/t12/alex”) будет успешен, только если удаляемый каталог пуст, т.е. содержит записи “точка” ( . ) и “двойная точка” (..).

       Для открытия или закрытия каталогов существуют вызовы:

       #include <dirent.h>

       DIR *opendir (const char *dirname); 

       int closedir( DIR *dirptr);

       Пример вызова:

       if ((d= opendir (“/home/s1”))==NULL) /* ошибка открытия */ exit(1);

Передаваемый вызову opendir параметр  является именем открываемого каталога. При успешном открытии каталога dirname вызов opendir возвращает указатель на переменную типа DIR. Определение типа DIR, представляющего дескриптор открытого каталога, находится в заголовочном файле “dirent.h”.

В частности, поле name структуры DIR  содержит запись имени файла, содержащегося в каталоге:

 

       DIR *d;

       ff=d->name ;

       printf(“%s\n”, ff);

Указатель позиции ввода/вывода после открытия каталога устанавливается на первую запись каталога. При неуспешном открытии функция возвращает значение NULL. После завершения работы с каталогом необходимо его закрыть вызовом closedir.

       Для чтения записей каталога существует вызов:

       struct dirent *readdir(DIR *dirptr);

       Пример вызова:

       DIR *dp;

       struct dirent *d;

       d=readdir(dp);

При первом вызове функции readdir в структуру dirent будет считана первая запись каталога. После прочтения всего каталога в результате последующих вызовов readdir будет возвращено значение NULL.

      

       Для возврата указателя в начало каталога на первую запись существует вызов: 

       void rewindir(DIR *dirptr);

       Чтобы  получить имя  текущего рабочего каталога существует функция:

       char  *getcwd(char *name, size_t size);

В переменную name при успешном вызове будут помещено имя текущего рабочего каталога:

       char name1[255];

       if (getcwd(name1, 255)==NULL)   perror(“ошибка вызова”)

       else printf(“текущий каталог=%s”,name1);

       Вызов:

       int chdir(const char *path);

изменяет текущий рабочий каталог на каталог path.

Системные вызовы stat и fstat  позволяют процессу  определить значения свойств в существующем файле:

#include <sys/types.h>

#include <sys/stat.h>

int stat (const char *pathname, struct stat *buf);

int fstat (int filedes, struct stat *buf);

Системный вызов stat имеет два аргумента: pathname – полное имя файла, buf – указатель на структуру stat, которая после успешного вызова будет содержать связанную с файлом информацию.

Системный вызов fstat функционально идентичен системному вызову stat. Отличие состоит в интерфейсе: вместо полного имени файла вызов fstat ожидает дескриптор файла, поэтому он может использоваться только для открытых файлов.

Определение структуры stat находится в системном заголовочном файле <sys/stat.h> и включает следующие элементы:

st_dev – описывает логическое устройство, на котором находится файл,

st_ino – задает номер индексного дескриптора,

st_mode – задает режим доступа к файлу,

st_nlink – определяет число ссылок, указывающих на файл,

st_uid, st_gid - соответственно идентификаторы пользователя и группы файла,

st_size – текущий логический размер файла в байтах,

st_atime – время последнего чтения из файла,

st_mtime – время последней модификации,

st_ctime – время последнего изменения информации, возвращаемой в структуре stat,

st_blksize – размер блока ввода/вывода,

st_blocks – число физических блоков, занимаемых файлом.


Для изменения прав доступа к файлу используется вызов:

  int chmod(const char *pathname, mode_t mode);

Пример:

if(chmod(“myfile.c”, 0604)==-1) perror(“ошибка вызова chmod\n”);

где 0604 – новые права доступа к файлу.

 

 

Порядок выполнения работы


1. Изучить теоретическую часть лабораторной работы.

2. Написать программу ввода символов с клавиатуры и записи их в файл (в качестве аргумента при запуске программы вводится имя файла). Для чтения или записи файла использовать функции посимвольного ввода-вывода getc(),putc() или им подобные. Предусмотреть выход после ввода определённого символа (например: ctrl-F). После запуска и отработки программы просмотреть файл. Предусмотреть контроль ошибок открытия/закрытия/чтения файла.

3. Написать программу просмотра текстового файла и вывода его содержимого на экран (в качестве аргумента при запуске программы передаётся имя файла, второй аргумент (N) устанавливает вывод по группам строк (по N –строк) или сплошным текстом (N=0)). Для чтения или записи файла использовать функции посимвольного ввода-вывода getc(),putc() или им подобные.  Предусмотреть контроль ошибок открытия/закрытия/чтения/записи файла.

4. Написать программу копирования одного файла в другой. В качестве параметров при вызове программы передаются имена первого и второго файлов. Для чтения или записи файла использовать функции посимвольного ввода-вывода getc(),putc() или им подобные.  Предусмотреть копирование  прав доступа к файлу и контроль ошибок открытия/закрытия/чтения/записи файла.

5. Написать программу вывода на экран содержимого текущего каталога.

Вывести с использованием данной программы содержимое корневого каталога. Предусмотреть контроль ошибок открытия/закрытия/чтения каталога.

6. Написать программу подсчёта числа отображаемых символов в строках текстового файла и формирование из полученных значений другого текстового файла, в котором будут расположены строки, каждая из которых представляет собой символьное изображение числа символов в данной строке из первого файла. Для чтения или записи файла использовать функции посимвольного ввода-вывода getc(),putc() или им подобные.  Имена файлов передаются в программу в качестве аргументов. Пример вывода программы для текстового файла:

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.