<<"\n GID:\t\t"<<gid
<<"\n Comment:\t"<<comment
<<"\n Home: \t"<<home
<<"\n Shell:\t"<<shell<<line;
}
string ToString()
{
char buf[32];
string s =
"\n Name: \t" + name +
"\n Pass: \t" + pass +
"\n UID:\t\t" + itoa(uid, buf, 10) +
"\n GID:\t\t" + itoa(gid, buf, 10) +
"\n Comment:\t" + comment +
"\n Home: \t" + home +
"\n Shell:\t" + shell + "\n";
return s;
}
};
class Users //===== Класс коллекции пользовательских записей
{
private:
// Объявите переменные: коллекция users адресов на объекты класса User
// строка data, в которую вы прочтете весь файл
// строка fileComment, в которую вы поместите комментарий файла
// символ разделителя delim
// размер файла fileSize
// текущая позиция size_t pos
// номер текущей строки line
public:
// Создайте конструктор и деструктор
void Clear() { /* Освободите память, занимаемую коллекцией */ }
void Read()
{
char *fn = 0;
if (fn = FileDlg (true)) // Узнайте имя файла
{
// Откройте его (с помощью API-функции CreateFile)
if (hFile == (HANDLE)-1)
throw string ("Couldn't open file");
cout <<"\n\nOpening file:\t" << fn;
// Узнайте размер файла fileSize =
if (fileSize == 0xFFFFFFFF)
{
CloseHandle(hFile);
throw string ("Wrong file size");
}
DWORD nBytes;
// Сотрите строку data (установите пробелы)
// Прочтите весь файл в строку data
CloseHandle(hFile);
if (fileSize != nBytes)
throw string ("Failed reading file");
}
else
throw string("Stop");
}
string GetToken() // Прочтите лексему
{
pos = data.find_first_not_of ("\r\n ", pos); // Ищем первый значащий символ
size_t end = data.find_first_of ("\r:", pos); // Ищем позицию разделителя
size_t fin = data.find_last_not_of (" ", end-1); // Ищем позицию значащего символа с конца
// Продолжайте дальше
string s = data.substr ( // Выделите часть строки
return s;
}
string GetPath()
{
string s = // Прочтите лексему
if (s.size() == 1)
{
string path = // Прочтите лексему
s += ":" + path;
}
return s;
}
short SetShort (string s) // Преобразует строку в короткое целое
{
char *stop, buf[32];
long id = strtol (s.c_str(), &stop, 0);
if (*stop != 0 || id > 0xffff)
{
string s = "SetShort: Wrong ID field at line = ";
throw s + itoa(line,buf,10);
}
return (short)id;
}
void Fill()
{
// Найдите в строке data позицию '\r'
// Выудите fileComment =
cout << "\nFile header:\t" << fileComment;
// Найдите в строке data позицию символа, не принадлежащего множеству: "\r\n\t "
for (line=1; pos < fileSize-1; line++)
{
string name = // Прочтите лексему
string pass = // Прочтите лексему
string id = // Прочтите лексему
short uid = // Преобразуйте в short
id = // Прочтите лексему
short gid = // Преобразуйте в short
string comm = // Прочтите лексему
string home = // Прочтите путь
string shell = // Прочтите путь
users.push_back ( /* Создайте объект класса User */);
}
}
User* GetUserByName (string name) // Поиск строки, содержащей искомое имя name
{
}
User* GetUserById (short id) // Поиск строки, содержащей искомый ID
{
}
void Out()
{
for (int i=0; i<int(users.size()); i++)
users[i]->Out();
// cout << users[i]->ToString();
}
char Menu()
{
cout <<"\n\n\tFind a user:\n"
"\n\tn - By name"
"\n\ti - By ID"
"\n\tq - Quit\n";
return getch();
}
void Process()
{
while (true)
{
User* user = 0; string s;
switch (Menu())
{
case 'n': user = /* Вызовите метод */ break;
case 'i': user = /* Вызовите метод */ break;
default:
if (No ("Want to quit ? (Y/N)"))
continue;
case 'q': throw string("Stop");
}
if (user)
{
user->Out();
getch();
}
}
}
};
void main()
{
cout <<"Users Service. Getting info from users files\n";
if (No ("Open a users file? (Y/N)"))
return;
while (true)
{
Users list;
try
{
list.Read();
list.Fill();
list.Process();
}
catch (string s)
{
list.Clear();
if (s == "Stop")
{
cout << "\nUsers service: Bye\n";
break;
}
if (No ("\nError: " + s + "\nTry again? (Y/N)"))
break;
}
}
cout <<"\n\n";
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.