КАТЕГОРИИ: Архитектура-(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) |
Листинг 7.11. Файл chap7\counter\counter. c
// ================================ // Програма CGI counter.c // Реалізація лічильника провідин // (С) Фролов А.В., 1997 // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // або // http://www.dials.ccas.ru/frolov // #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> #include <fcntl.h> void main(int argc, char *argv[]) { // Ідентифікатор файла шаблона головної сторінки HRLE hSrcFile; // Ідентифікатор файла лічильника RLE *CounterFile; // Розмір файла шаблона DWORD dwFileSize; // Адреса шаблона головної сторінки LPSTR szTemplate; // Тимчасовий буфер для роботи з лічильником CHAR szBuf[10]; // Поточне значення лічильника INT nCounter; // Покажчик на поле лічильника в шаблоне LPSTR szCounterPtr; // Считываем файл шаблона в оперативну пам'ять // Відчиняємо файл шаблона hSrcFile = lopen("HOME.TM", OF_READ); // Визначаємо розмір файла в байтах dwFileSize = _llseek(hSrcFile, 0, 2); // Встановлюємо покажчик поточної позиції // на початок файла шаблона _llseek(hSrcFile, 0, 0); // Одержуємо пам'ять для буфера шаблона szTemplate = malloc(dwFileSize); // Завантажуємо шаблон у буфер _hread(hSrcFile, szTemplate, dwFileSize); // Збільшуємо значення лічильника у файлі // Відчиняємо файл лічильника для читання CounterFile = fopen("CNTDAT.DAT", "r"); // Читаємо їхнього файла рядок значення лічильника fgets(szBuf, 7, CounterFile); // Закриваємо файл лічильника fclose(CounterFile); // Перетворимо значення лічильника з текстовий // рядки в чисельний розмір sscanf(szBuf, "%d", &nCounter); // Збільшуємо значення лічильника nCounter++; // Записуємо в буфер szBuf 5 цифр нового // значення лічильника sprintf(szBuf, "%05.5ld", nCounter); // Зберігаємо нове значення лічильника у файлі CounterFile = fopen("CNTDAT.DAT", "w"); fprintf(CounterFile, "%d", nCounter); fclose(CounterFile); // Заміняємо 5 цифр гостріння лічильника на нові // у буфері шаблона // Шукаємо маркер поля лічильника szCounterPtr = strstr(szTemplate, "~~~~~"); // Копіюємо в це поле нове значення лічильника if{szCounterPtr!= NULL) strncpy(szCounterPtr, szBuf, 5); // Выводим заголовок HTTP і розділювальний рядок printf("Content-type: text/html\n\n"); // Выводим шаблон із зміненим значенням // поля лічильника fwrite(szTemplate, dwFileSize, l, stdout); // Звільняємо буфер шаблона free(szTemplate); }
Отримавши керування, програма COUNTER считывает файл шаблона в оперативну пам'ять. Для спрощення вихідного тексту програми застосовані для роботи з файлом функції _lopen, _llseek і _hread, що є специфичными для операційної системи Microsoft Windows. Можливо використовувати тут будь-які інші функції, призначені для роботи з файлами. Перед читанням файла шаблона визначається його довжина в байтах, для чого використовується відомий прийом з установкою поточної позиції на кінець файла функцією _llseek. Після того як розмір файла буде збережений у перемінної dwFileSize, що текет позиція знову встановлюється на початок файла шаблона. Слідом за цим програма CGI динамічно замовляє пам'ять для буфера і читає в цей буфер файл шаблона за один виклик функції _hread. Далі програма відчиняє файл лічильника і считывает із нього один текстовий рядок, користуючи для цього функцією fgets. Передбачається, що в цьому рядку знаходиться значення лічильника в символьном виді. Після читання файл лічильника закривається, а отримане значення перетвориться в чисельний розмір і збільшується на одиницю. Далі нове значення лічильника зберігається у файлі лічильника і записується в символьном виді в буфер szBuf, відкіля буде виконуватися вставка нового значення лічильника в шаблон документа. Процедура вставки виконується після відновлення умісту файла лічильника і полягає в тому, що знайдене за допомогою функції strstr поле шаблона обновляється з буфера szBuf. Після відновлення шаблона в стандартний потік висновка записується звичайний заголовок HTTP (функцією printf) і шаблон (функцією fwrite). На останньому етапі звільняється буфер пам'яті, замовленняанный для буфера шаблона.
Дата добавления: 2014-11-29; Просмотров: 335; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |