Студопедия

КАТЕГОРИИ:


Архитектура-(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: [email protected]

// 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; Просмотров: 311; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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