Листинг 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). На останньому етапі звільняється буфер пам'яті, замовленняанный для буфера шаблона.
Дата добавления: 2015-04-19; просмотров: 559;