我使用的IDE为 VS2022,仅实现对文件内容的的添加以及修改,一本书是否被删除,我这里是以图书的状态来划分,如果这本书的状态为删除,则不显示出来,但是存在文本里;并且我这里是退出程序才会进行修改文本内容,删除则直接修改保存文本。
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
int BookNumber;//书的总数量
struct BookInfo
{
int ID;
char Name[50];
char Author[30];
float Price;
char State[10];
};
struct BookInfo BI[200];
void InitializeBookInfo();//初始化图书信息
void ReadBookInfo(int number);//输出书籍信息
void AddBook(int OneOrTwo);//添加书籍
void SearchBook(int OneOrTwo);//查询
void Menu();//菜单
void UpBookInfo();//修改图书信息
void DelBook();//删除图书信息
void SaveFile();//保存文件
/*
* strcpy(字符串1,字符串2);将字符串2的内容复制给字符串1
* strtok(字符串1,字符串2);将字符串1分割,分隔符为字符串2
* atoi(字符串);将字符串转换为int类型的,失败则返回0
* atof(字符串);将字符串转换为float类型的
* strstr(字符串1,字符串2);在字符串1里找字符串2;
*/
main() {
HWND hwnd = GetConsoleWindow();
LONG Style; //窗口风格
Style = GetWindowLong(hwnd, GWL_STYLE); // 得到窗口风格
Style = Style & ~WS_CAPTION; //去掉标题栏
SetWindowLong(hwnd, GWL_STYLE, Style); //为窗口设置新的风格
InitializeBookInfo();
Menu();
}
void InitializeBookInfo() {
char c[1000];
int CurrentLine = 0;
FILE* fp1 = fopen("../BookInfo1.txt", "r");//打开文件
if (fp1 == NULL) {//若文件不存,则新建一个;
//printf("文件不存在!");
fp1 = fopen("../BookInfo1.txt", "w");
fclose(fp1);
}
else {
while (!feof(fp1))
{
char* result = NULL;
int line = 0;
//fgets(c, 100, fp1); //从输入文件读取一行字符串
char delims[] = "|";
result = fgets(c, 100, fp1);
if (result == NULL) {
continue;
}
result = strtok(result, delims);
while (result != NULL && result != "" && result != "\n")
{
if (line == 0) {
BI[CurrentLine].ID=atoi(result);
}
if (line == 1) {
strcpy(BI[CurrentLine].Name, result);
}
if (line == 2) {
strcpy(BI[CurrentLine].Author, result);
}
if (line == 3) {
BI[CurrentLine].Price= atof(result);
}
if (line == 4) {
strcpy(BI[CurrentLine].State, result);
}
result = strtok(NULL, delims);
line++;
}
CurrentLine++;
}
fclose(fp1);//关闭输入文件
BookNumber = CurrentLine;
}
}
void Menu()
{
int c, number;
printf("\n\n*******************************************\n");
printf("1:新增图书信息 2:查找图书信息\n");
printf("3:修改图书信息 4:删除图书信息\n");
printf("5:显示图书信息 6:退出系统\n");
printf("*******************************************\n");
printf("请输入操作选项:\n");
scanf_s("%d", &c);
switch (c)
{
case 1:
printf("请输入本次添加的书籍有多少本");
scanf_s("%d", &number);
AddBook(number);
break;
case 2:
printf("1:按照书名查询 2:按作者查询\n");
scanf_s("%d", &number);
SearchBook(number);
break;
case 3:
ReadBookInfo(0);
UpBookInfo();
break;
case 4:
DelBook();
break;
case 5:
ReadBookInfo(0);
Menu();
break;
case 6:
SaveFile();
exit(0);
break;
default:
SaveFile();
exit(0);
break;
}
}
void ReadBookInfo(int number) {
int i;
printf("序号\t书名\t作者\t价格\t状态\n");
if (number == 0) {
for (i = 0; i < BookNumber; i++) {
if (!strstr(BI[i].State, "删除")) {//状态为删除的不显示
printf("%d\t", BI[i].ID);
printf("%s\t", BI[i].Name);
printf("%s\t", BI[i].Author);
printf("%.2f\t", BI[i].Price);
printf("%s", BI[i].State);
}
}
}
else {
printf("%d\t", BI[number-1].ID);
printf("%s\t", BI[number - 1].Name);
printf("%s\t", BI[number - 1].Author);
printf("%.2f\t", BI[number - 1].Price);
printf("%s", BI[number - 1].State);
}
}
void AddBook(int number) {
int i;
for (i = 0; i < number; i++) {
printf("\n请输入第%d本书的书名:\n", i + 1);
scanf_s("%s", BI[BookNumber].Name, 30);
printf("请输入作者:\n");
scanf_s("%s", BI[BookNumber].Author, 20);
printf("请输入价格:\n");
scanf_s("%f", &BI[BookNumber].Price);
strcpy(BI[BookNumber].State,"正常\n");
BI[BookNumber].ID = BookNumber + 1;
BookNumber = BookNumber + 1;
}
Menu();
}
void SearchBook(int OneOrTwo) {
char Name[20] = { "\0" };
int i;
if (OneOrTwo == 1) {
printf("请输入书名:\n");
scanf_s("%s", Name, 20);
printf("序号\t书名\t作者\t价格\t状态\n");
for (i = 0; i < BookNumber; i++) {
if (strstr(BI[i].Name, Name)&& !strstr(BI[i].State, "删除")) {
printf("%d\t", BI[i].ID);
printf("%s\t", BI[i].Name);
printf("%s\t", BI[i].Author);
printf("%.2f\t", BI[i].Price);
printf("%s", BI[i].State);
}
}
}
else {
printf("请输入书名:\n");
scanf_s("%s", Name, 20);
printf("序号\t书名\t作者\t价格\t状态\n");
for (i = 0; i < BookNumber; i++) {
if (strstr(BI[i].Author, Name) && !strstr(BI[i].State, "删除")) {
printf("%d\t", BI[i].ID);
printf("%s\t", BI[i].Name);
printf("%s\t", BI[i].Author);
printf("%.2f\t", BI[i].Price);
printf("%s", BI[i].State);
}
}
}
Menu();
}
void UpBookInfo() {
int bookNumber;
printf("请输入该书的编号:(输入0则返回上一层菜单)");
scanf_s("%d", &bookNumber);
if (bookNumber == 0) {
Menu();
}
else {
int i;
ReadBookInfo(bookNumber);
printf("书名:");
scanf_s("%s", BI[bookNumber - 1].Name, 50);
printf("作者:");
scanf_s("%s", BI[bookNumber - 1].Author, 30);
printf("价格:");
scanf_s("%f", &BI[bookNumber - 1].Price);
printf("状态:");
scanf_s("%s", BI[bookNumber - 1].State, 10);
strcat(BI[bookNumber - 1].State, "\n");
Menu();
}
}
void DelBook() {
int num;
printf("\n请输入要删除的编号:(输入0则返回上一层菜单)\n");
scanf_s("%d",&num);//
if (num != 0) {
strcpy(BI[num - 1].State, "删除\n");//将相应图书的状态改为删除
SaveFile();
}
Menu();
}
void SaveFile() {
int i;
FILE* fp1 = fopen("../BookInfo1.txt", "w");//打开文件
for (i = 0; i < BookNumber; i++) {
char str[1024];
sprintf(str, "%d|%s|%s|%.2f|%s", BI[i].ID, BI[i].Name, BI[i].Author, BI[i].Price, BI[i].State);//字符串拼接赋给str;
fputs(str, fp1);//写入文件
}
fclose(fp1);
}