Синтаксический анализ файлов, страница 2

    <<"\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";

}