Как искать запись по идентификатору - PullRequest
0 голосов
/ 01 мая 2019

Я создаю систему, которая выводит всех зарегистрированных учеников в один из моих текстовых файлов, например:

123 Michael
412 Voker
512 Karl
143 Riki

Мне нужно использовать их ID для поиска ученика. Средства, которые мне нужны для чтения этого регистрационного файла ученика.

Система будет запрашивать только идентификатор.например,

Type ID num: 123

ВЫХОД:

Hello Michael your ID number is 123.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Подождите, здесь я собрал рабочий пример, охватывающий все ваши вопросы.

Приведенное ниже решение написано очень идиоматически c++ (решение использует stream_iterators при записи / чтении файлов для нетривиального типа данных контейнера (то есть std::map):

#include <iostream>
#include <map>
#include <sstream>
#include <algorithm>    // copy, ...
#include <utility>      // pair, ...    
#include <fstream>
#include <iterator>
using namespace std;


typedef map<size_t, string> directory;
typedef pair<size_t, string> dir_kv_pair;

struct kv_dir : public dir_kv_pair {
                        kv_dir(void) = default;
                        kv_dir(directory::value_type kv):       // type conversion helper
                         dir_kv_pair{kv} {}                     // pair <-> kv_dir
    friend ostream &    operator<<(ostream & os, const kv_dir &kv)
                         { return os << kv.first << " " << kv.second << endl; }
    friend istream &    operator>>(istream & is, kv_dir& kv) {
                         if((is >> kv.second).eof()) return is;
                         kv.first = stol(kv.second);
                         return is >> kv.second;
                        }
};


int main()
{ 
 string fname = "dir.txt";

 {  // write into file
  directory dir;

  // filling the container
  dir[123] = "Michael";
  dir[412] = "Voker";
  dir[512] = "Karl";
  dir[143] = "Riki";

  // writing to file:
  ofstream fout{fname};
  copy(dir.begin(), dir.end(), ostream_iterator<kv_dir> {fout});
 }

 // reading from file:
 directory dir{ istream_iterator<kv_dir>{ ifstream{fname} >> skipws }, 
                istream_iterator<kv_dir>{} };

 // finding by ID
 size_t id = 512;
 cout << "Pupil id [" << id << "]: " << (dir.count(id) == 1? dir[id]: "not found") << endl;
}

Пример вывода:

Pupil id [512]: Karl
bash $
bash $ cat dir.txt 
123 Michael
143 Riki
412 Voker
512 Karl
bash $ 
0 голосов
/ 01 мая 2019

Возможно, вы ищете структуру или класс. Я бы сказал, ученик, сделай урок.

class Student{
     public:
         int id;
         char *name;
};

Student s;

Пройдите по ссылке [1], чтобы понять, как вы можете читать или записывать объект Student из файла или в файл соответственно.

[1] https://www.geeksforgeeks.org/readwrite-class-objects-fromto-file-c/

...