以下是一个简单的基于文件的图书管理系统,包含了菜单、文件读取和保存等基本功能:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BOOKS 100
#define MAX_TITLE_LENGTH 50
#define MAX_AUTHOR_LENGTH 30
#define DATA_FILE "books.txt"
struct Book {
char title[MAX_TITLE_LENGTH];
char author[MAX_AUTHOR_LENGTH];
int year;
};
int count = 0;
struct Book books[MAX_BOOKS];
void display_menu() {
printf("==== 图书管理系统 ====\n");
printf("1. 添加图书\n");
printf("2. 显示所有图书\n");
printf("3. 保存并退出\n");
}
void add_book() {
if (count >= MAX_BOOKS) {
printf("系统已满,无法添加更多图书。\n");
return;
}
struct Book book;
printf("请输入图书名称:");
fgets(book.title, MAX_TITLE_LENGTH, stdin);
book.title[strcspn(book.title, "\n")] = 0; // 去掉末尾的换行符
printf("请输入作者名字:");
fgets(book.author, MAX_AUTHOR_LENGTH, stdin);
book.author[strcspn(book.author, "\n")] = 0; // 去掉末尾的换行符
printf("请输入出版年份:");
scanf("%d", &book.year);
getchar(); // 读取多余的换行符
books[count++] = book;
printf("添加成功。\n");
}
void display_books() {
if (count == 0) {
printf("系统中没有任何图书。\n");
return;
}
printf("图书列表如下:\n");
for (int i = 0; i < count; i++) {
printf("%d. %s,作者:%s,出版年份:%d\n",
i+1, books[i].title, books[i].author, books[i].year);
}
}
void save_books() {
FILE *fp = fopen(DATA_FILE, "w");
if (fp == NULL) {
printf("无法打开数据文件 %s,保存失败。\n", DATA_FILE);
return;
}
for (int i = 0; i < count; i++) {
fprintf(fp, "%s|%s|%d\n", books[i].title, books[i].author, books[i].year);
}
fclose(fp);
printf("数据已保存至 %s。\n", DATA_FILE);
}
void load_books() {
FILE *fp = fopen(DATA_FILE, "r");
if (fp == NULL) {
printf("无法打开数据文件 %s,无法加载之前的数据。\n", DATA_FILE);
return;
}
count = 0;
char buffer[MAX_TITLE_LENGTH + MAX_AUTHOR_LENGTH + 10];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
struct Book book;
char *token = strtok(buffer, "|");
strncpy(book.title, token, MAX_TITLE_LENGTH);
token = strtok(NULL, "|");
strncpy(book.author, token, MAX_AUTHOR_LENGTH);
token = strtok(NULL, "|");
book.year = atoi(token);
books[count++] = book;
}
fclose(fp);
printf("数据已从 %s 加载成功。\n", DATA_FILE);
}
int main() {
load_books();
int choice;
do {
display_menu();
printf("请选择:");
scanf("%d", &choice);
getchar(); // 读取多余的换行符
switch (choice) {
case 1:
add_book();
break;
case 2:
display_books();
break;
case 3:
save_books();
break;
default:
printf("无效的选择。\n");
}
} while (choice != 3);
return 0;
这段代码实现了一个简单的图书管理系统,可以添加图书、显示所有图书以及保存数据。数据存储在一个文本文件中,每一行代表一本图书,包含书名、作者和出版年份。在程序启动时,它会尝试从文件中读取之前保存的数据,如果文件不存在或无法读取,则会创建一个空的图书列表。用户可以通过菜单选择不同的操作,包括添加图书、显示所有图书和保存数据并退出程序。