1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# Kindle
## Помощни средства които използвахме
За решението на тази задача използваме клас string, клас vector и клас pair. String е взет директно от семинарите на първа група, с добавена функция getLine(), която използваме подобно на std::getline();
Вектора е взет от семинарите на втора група.
Класът Pair е единствено с цел улеснение. Той представлява наредена двойка от два темплейтни типа.
Всяко едно нещо което сме направили с тези помощни средства може да се направи и без тях - просто кодът става по - дълъг.
## Използване на командите
### Команди, които поддържаме преди да се логне потребител:
* login - влизаме в системата
* signup - регистрираме се в системата
* view - преглеждаме какви книги имаме
* save - запазваме текущия Kindle във файл
* load - зареждаме Kindle от файл
* exit - излизаме от системата
### Команди, които има потребител:
* read - прочита книга
* write - пише книга
* rate - оценява книга
* comment - коментира под книга
* rates - проверява рейтинга на книгата
* comments - проверява коментарите под книгата
* view - преглежда какви книги има
* exit - излиза от профила си
### Команди които имаме докато четем книга:
* n - следваща страница
* p - предишна страница
* @ + [number] - отива на страница, която е подадена
* h - показва/скрива help меню
* q - излиза от режим на четене
Въвеждаме команда и натискаме Enter. След това програмата ни пита ако има нужда от допълнителна информация. Пример
```
> login
> Enter user name: [Name]
> Enter user password: [Password]
> Success!
>
```
## Накратко за запазването във файлове
Имаме да запазваме сложна структура във файл. Това което можем да направим е да я разбием на по - прости. В Kindle имаме два вектора, които представляват книгите и потребителите. Ако измислим метод да запазим книга и потребител другото е лесно. Можете да видите, че в класовете представляващи книга и потребител имаме отделни функции, които се грижат за работата със запазването.
Логиката за тях е аналогична - разбиваме структурата на по - малки структурки, които стават все по - лесни и по - лесни за запазване.
## Допълнителни бележки
В решението сме използвали friend класове. Това не винаги е лоша идея, но внимавайте с тях - възможно е да доведат до логически грешки, тоест на един клас да се дадат твърде много права над друг.
При запазването на класа ще видите следния код
```cpp
outFile.write("#Ty", 4);
```
При четенето на класа ще видите следния код
```cpp
char typeChecker[4];
inFile.read(typeChecker, 4);
if (strcmp(typeChecker, "#Ty") != 0) {
std::cout << "Invalid file type" << std::endl;
return;
}
```
Реално, няма как да гарантираме, че подадения файл ни е коректен. Потребителя винаги може да подаде некоректен файл, което може да счупи нашата система. За това правим следното: в началото на файла, който запазваме, записваме някаква последователност от n символа. Когато четем, прочитаме първите n (в случая 4) байта от файла и казваме - ако това е "тайният" низ, то значи този файл е писан от системата, тоест се очаква да е коректен. В противен случай приключваме изпълнението и не четем излишни данни, които могат да счупят системата ни.
Също така, функционалността за промяна на книга оставяме на Вас. Чувствайте се свободни да експериментирате и pull-request вате.
<b>При каквито и да е въпроси екипът по ООП е на линия.</b>
|