Move the unread chapters number into an entry in item::item_vars.

Add some chapter functions to the item class. The number of unread chapters is stored with the id of the player character, so different player characters on the same world can read the same book independently.
Rename islot_book::type to skill.

Extract the skill into a local variable when using it in the two read functions in player.cpp, so one does not need to repeat the islot_book pointer.
Check the skill for being null (which is quite likely), it won't cause a crash most of the time as player::skillLevel "allows" it. In fact player::skillLevel will just create a new skill level for the null-skill and return that.

It's far more obvious what is meant by someItem.type->book->skill instead of someItem.type->book->skill.
Make the remaining members of islot_book ints

No point in having them all be of different signedness and size. int is good enough for everyone.