Листинг 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; просмотров: 501;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.