Задан файл (условно, база данных пользовательских учетных записей 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.