Синтаксический анализ файлов

Страницы работы

5 страниц (Word-файл)

Содержание работы

Задание: Синтаксический анализ файлов

Задан файл (условно, база данных пользовательских учетных записей UNIX) следующего формата:

# comment8

8

username:password:UID:GID:usercomment:home:shell8

username:password:UID:GID:comment:home:shell8

. . .

username:password:UID:GID:comment:home:shell8

#        — символ начала комментария,

8        — символ разделителя записей,

:        — символ разделителя полей записи,

comment  — незначащий комментарий,

username — имя пользователя (строка),

password — пароль пользователя (строка),

UID      — идентификатор пользователя (короткое целое),

GID      — идентификатор первичной группы пользователя (короткое целое),

comm     — комментарий к учетной записи пользователя (строка),

home     — путь к домашнему каталогу пользователя (строка),

shell    — путь к начальному интерпретатору пользователя (строка).

Создайте 2 класса: User (одна пользовательская запись) и Users (коллекция пользовательских записей). В классе Users реализуйте 2 метода доступа к записям базы данных: GetUserByName, GetUserById.

Пример разработки снизу  вверх

Нанем разработку с создания удобных структур данных, точнее классов, икапсулирующих функциональность, определенную заказчиком. Предположим, что нам надо разработать приложение в стиле 90-х годов прошлого века на основе динамических структур данных (контейнеров, или шаблонов контейнеров) библиотеки STL, прототипы которых описаны в файлах заголовков, минимальный набор которых следует поместить в файл stdafx.h:

#include <windows.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#include <iostream>

#include <vector>

#include <string>

using namespace std;

Затем разработаем несколько полезных утилит (глобальных функций, которые можно использовать в различних проектах). Это некоторого рода инструменты разработки.

#include "stdafx.h"

//======== Глобальные функции (полезные утилиты)

void Clear (istream& is) // Очистка буфера клавиатуры

{                  // В С и С++ это всегда было слабым местом

if (cin.eof())    // Подробности см. в MSDN

  return;

int n = is.rdbuf()->in_avail(); // Сколько байт в буфере?

while (n--)         // Выбираем все по одному

  is.rdbuf()->sbumpc();

is.clear();         // Снимаем признак ошибки в потоке ввода (failbit)

}

string GetLine (string prompt) // Просим ввести строку (не более 127 символов)

{

cout << endl << prompt << ": ";

char buf[128];

cin.getline (buf, 128);

Clear (cin);

return string(buf);

}

bool Yes (char* prompt)  // Просим выбрать ответ: Yes or No

{

printf ("\n%s: ", prompt);

return toupper (getche()) != 'N';

}

bool No (string prompt)  // Просим выбрать ответ: Yes or No

{

cout << endl << prompt << ": ";

return toupper (getche()) != 'Y'; //GetLine (prompt)[0]) != 'Y';

}

char* FileDlg (bool bRead)  //=== bRead - режим чтения файла

{

TCHAR szFile[MAX_PATH] = { 0 };  // Возращаемая строка с именем файла

//====== Фильтр файловых расширений

TCHAR *szFilter = "Users Data Files (*.users)\0*.users\0All Files\0*.*\0";

TCHAR szCurDir[MAX_PATH]; // Начнем с текущей директории

::GetCurrentDirectory(MAX_PATH-1, szCurDir);

OPENFILENAME ofn; // Структура, используемая стандартным диалогом

ZeroMemory(&ofn, sizeof(OPENFILENAME));

ofn.lStructSize = sizeof(OPENFILENAME); // Параметры настройки диалога

ofn.lpstrFilter = szFilter;

ofn.nFilterIndex= 1;  // Начальный индекс массива строк фильтра равен 1

ofn.lpstrFile = szFile;

ofn.nMaxFile = sizeof(szFile);

ofn.lpstrTitle = "Найдите файл с данными о пользователях"; // Заголовок диалога

ofn.nMaxFileTitle = sizeof (ofn.lpstrTitle);

ofn.lpstrInitialDir = szCurDir;  // Начальная директория

ofn.Flags   = OFN_EXPLORER | OFN_OVERWRITEPROMPT;

ofn.lpstrDefExt = "users";

//====== Создаем и открываем диалог (при неудаче возвращает 0)

BOOL b = bRead ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn);

return b ? strcpy (new char[strlen(ofn.lpstrFile) + 1], ofn.lpstrFile) : 0;

}

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

class User //===== Класс пользовательских записей

{

// Объявите другом класс Users;

private:

// Объявите переменные: name, pass, comment, home, shell;

// Объявите переменные: uid, gid;

public:

// Создайте 2 конструктора

void Out()

{

  string line = "\n----------------------------------------------";

  cout<<endl<<line

    <<"\n  Name: \t"<<name

    <<"\n  Pass: \t"<<pass

    <<"\n  UID:\t\t"<<uid

Похожие материалы

Информация о работе