Version: 1.1
A simple Library Management System implemented in modern C++ (C++17).
The program provides a text-based menu to add members/books, borrow/return books, search and list records. Data is persisted in two plain text files (books.txt, members.txt). The system tracks per-book copy counts and how many copies are currently borrowed.
- Add / register a new member
- Add / register a new book (track copies in stock)
- Borrow a book (member can borrow up to 3 books)
- Return a book
- Track
borrowedCountper book (how many copies are currently loaned out) - Track which book IDs each member has borrowed
- List members and books (shows available copies =
copiesInStock - borrowedCount) - Search members by first name and books by title
- Save / load persistent data from plain text files
- C++17 (or later) compatible compiler (e.g.
g++,clang++, MSVC) - OS: Windows / Linux / macOS
- Console encoding: UTF-8 recommended (if using non-ASCII/Persian text)
-
Put the source code into
main.cpp. -
Compile:
g++ -std=c++17 -O2 -o library main.cpp
-
Run:
-
Linux/macOS:
./library
-
Windows (CMD / PowerShell):
library.exe
-
books.txt— stores book records (one per line).members.txt— stores member records (one per line).
Each line uses | separators and the fields are:
<id>|<title>|<author>|<copiesInStock>|<borrowedCount>id= integer book identifiertitle= book title (may contain spaces)author= author namecopiesInStock= total copies the library owns (integer)borrowedCount= number of copies currently loaned out (integer)
Example:
1|The C++ Programming Language|Bjarne Stroustrup|5|2
2|Clean Code|Robert C. Martin|3|0Each line uses | to separate basic fields; after birthYear there may be a comma-separated list of borrowed book IDs:
<memberId>|<firstName>|<lastName>|<birthYear>[,<borrowedBookId1>,<borrowedBookId2>,...]Examples:
1001|Ali|Salehi|1999,1,2
1002|Sara|Ahmadi|2000When running, the program shows a menu:
1. Register Member
2. Register Book
3. Checkout Book (borrow)
4. Checkin Book (return)
5. Print Members
6. Print Books
7. Find Member by First Name
8. Find Book by Title
0. Exit- Plain text parsing is fragile; malformed lines can crash the program.
cin/getlineusage with multiplecin.ignore()calls may skip inputs.- Single-user design; concurrent runs may corrupt files.
- No timestamps, authentication, or roles.
0 <= borrowedCount <= copiesInStockshould be maintained.
- Wrap
stoicalls intry/catchto handle malformed lines. - Use JSON or SQLite instead of plain text files.
- Refactor input handling without
goto. - Implement case-insensitive or partial search.
- Track borrow/return timestamps and history.
- Improve UI prompts and error messages.
- Add concurrency safety for multi-user access.
- Multiple
cin.ignore()calls beforegetlinemay skip inputs. gotoin input loops complicates flow.persistData()overwrites files atomically — a crash may leave partial data.- Previous docs incorrectly described
books.txtas a single borrowed bit; current code usesborrowedCountandcopiesInStock.
- Branch naming:
feature/<short-description>orfix/<short-description> - Commit example:
✅ fix: improve input validation in book and member registration
- Added reusable input checks
- Replaced goto loops with helper functions
- Ensured input buffer is properly cleared on failureMIT
Mohammad Mohammadi
نسخه: 1.1
این پروژه یک سیستم سادهٔ مدیریت کتابخانه به زبان C++17 است.
برنامه دارای منوی متنی است و امکانات زیر را فراهم میکند: افزودن عضو و کتاب، امانت دادن و بازگرداندن کتاب، جستجو و نمایش فهرستها.
دادهها در دو فایل متنی (books.txt و members.txt) ذخیره میشوند و تعداد نسخههای کتابها و تعداد کتابهای قرض گرفته شده نیز مدیریت میشوند.
- ثبت عضو جدید
- ثبت کتاب جدید (مدیریت تعداد نسخهها)
- قرض دادن کتاب (حداکثر ۳ کتاب برای هر عضو)
- بازگرداندن کتاب
- پیگیری تعداد نسخههای قرض داده شده (
borrowedCount) برای هر کتاب - پیگیری شناسه کتابهایی که هر عضو قرض گرفته است
- نمایش فهرست اعضا و کتابها (نسخههای موجود =
copiesInStock - borrowedCount) - جستجو بر اساس نام کوچک اعضا و عنوان کتاب
- ذخیره و بازیابی دادهها در فایل متنی
- کامپایلر C++17 یا بالاتر (مانند
g++،clang++) - سیستمعامل: ویندوز / لینوکس / مک
- توصیه: UTF-8 برای متون فارسی
-
سورس کد را در
main.cppقرار دهید. -
کامپایل:
g++ -std=c++17 -O2 -o library main.cpp
-
اجرا:
-
لینوکس/مک:
./library
-
ویندوز:
library.exe
-
books.txt— اطلاعات کتابها (هر سطر یک کتاب)members.txt— اطلاعات اعضا (هر سطر یک عضو)
<id>|<title>|<author>|<copiesInStock>|<borrowedCount>id= شناسه کتابtitle= عنوان کتابauthor= نام نویسندهcopiesInStock= تعداد کل نسخههاborrowedCount= تعداد نسخههای قرض گرفته شده
مثال:
1|The C++ Programming Language|Bjarne Stroustrup|5|2
2|Clean Code|Robert C. Martin|3|0<memberId>|<firstName>|<lastName>|<birthYear>[,<borrowedBookId1>,<borrowedBookId2>,...]مثالها:
1001|Ali|Salehi|1999,1,2
1002|Sara|Ahmadi|2000پس از اجرا، منو به صورت زیر نمایش داده میشود:
1. ثبت عضو
2. ثبت کتاب
3. قرض دادن کتاب
4. بازگرداندن کتاب
5. نمایش اعضا
6. نمایش کتابها
7. جستجوی عضو بر اساس نام کوچک
8. جستجوی کتاب بر اساس عنوان
0. خروج- پردازش فایل متنی ساده است و خطا در فرمت فایل ممکن است باعث کرش شود.
- استفاده از
cin.ignore()وgetline()ممکن است باعث رد شدن برخی ورودیها شود. - طراحی تککاربره است و دسترسی همزمان پشتیبانی نمیشود.
- زمان و نقشهای کاربری ثبت نمیشوند.
0 <= borrowedCount <= copiesInStockباید رعایت شود.
- اضافه کردن try/catch برای
stoiو جلوگیری از کرش در صورت فایل خراب - استفاده از JSON یا SQLite به جای فایل متنی
- حذف یا جایگزینی
gotoبا حلقههای کنترلشده - پیادهسازی جستجوی بدون حساسیت به حروف یا جستجوی جزئی
- ثبت تاریخ امانت و بازگشت
- بهبود پیامهای ورودی و خطا
- اطمینان از همگامسازی دادهها در حالت چندکاربره
- چند
cin.ignore()ممکن است ورودی را رد کند. gotoدر حلقههای ورودی، خوانایی را کاهش میدهد.persistData()فایلها را به صورت کامل بازنویسی میکند و در صورت کرش ممکن است دادهها ناقص شوند.- نسخه قبلی اسناد،
books.txtرا به عنوان یک بیت قرضی توضیح داده بود؛ اکنونborrowedCountوcopiesInStockجایگزین شدهاند.
- نام شاخهها:
feature/<توضیح کوتاه>یاfix/<توضیح کوتاه> - مثال کامیت:
✅ fix: بهبود اعتبارسنجی ورودی در ثبت کتاب و عضو
- اضافه کردن بررسی ورودیها
- استفاده از توابع کمکی به جای goto
- پاکسازی بافر ورودی در صورت خطاMIT
محمد محمدی