Найти в Дзене
D21nk Master

Макросы бывают не только в играх

Мы разобрали замечательную вещь,аименно аргументы программ.И уже только благодаря им мы написали отличную утилиту,заменяющую cat или type.Конечно,у нас нет каких-то ключиков для неё,но наша замена занимает всего лишь 11-12 строк!

Предлагаю вам частично ещё заменить одну интересную утилиту - wc,в отличие от неё наша утилита ограничится подсчётом только символов и строк,wc так же подсчитывает ещё и слова.

Попробуйте реализовать её сами по следующему плану:

Переменная для подсчёта символов(с)
Переменная для подсчёта переноса строки(п)
Принять аргументом файл
Если файл открыт успешно
Пока не достигнут конец файла
Если текущий символ перенос строки
Прибавить единицу для п
Прибавить единицу для с
Иначе
Вывести сообщение об ошибке
Закрыть программу
Вывод результатов

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

И так,макросы это специальные инструкции препроцессора.Что это значит?

Всё просто и на самом деле мы этим тоже уже пользовались.Препроцессор-это то,что компилятор "осваивает" в первую очередь,то есть до всего тела программы.

До выполнения тела программы-мы всегда подключали библиотеки,это и есть инструкция препроцессора.Предлагаю вам разобрать #define.

С ней обстоят дела куда интереснее,во время компиляции,всё,что мы с помощью неё создадим-просто заменяется в программе.А создавать с её помощью можно как раз те самые макросы и не только.

С её помощью можно создать даже константу:

#define MAX 37

По имени MAX будет доступно значение 37,да,знак равно тут не нужен.Одной из отличительных особенностей define-нет возможности определить,где заканчивается макрос,потому как после переноса строки-макрос заканчивается и некоторые новички пишут всё строго в одну строку.

Мы же с вами бунтари и нам это не устраивает,потому там,где нам нужен перенос строки просто поставим '\'.

Перед кодом обработчика познакомлю вас с одной функцией - exit,своим аргументом принимает число с которым программа завершится.Находится в библиотеке stdlib.h.

Обработчик:

#include <stdio.h>
#include <stdlib.h>
#define errshow(a)\
printf("%s\n",a);\
exit(1);
void main(int argc,char *argv[])
{
//если аргументов не равно 2
if(argc!=2)
{
//вывести справку
printf("Usage %s file\n",argv[0]);
exit(0);
}
FILE *file=fopen(argv[1],"r");
if(file==NULL)
errshow("Can't open file");
}

Вот так всё просто,слово define,имя и в скобках параметры,далее можно использовать функции.В случае со справкой-тут всё просто,первый аргумент-всегда имя программы,потому проверим два ли их.

На этом мы остановимся.Домашнее задание-написать аналог программы wc по плану выше,так же добавьте обработчики в программу по шифрованию.

С вами был D21nkMaster, всего доброго!