gpt4 book ai didi

c++ - 为什么我的图书馆管理程序没有写入文件

转载 作者:行者123 更新时间:2023-11-28 00:17:07 28 4
gpt4 key购买 nike

我正在创建一个图书馆管理系统,您可以在其中添加书籍、DVD 和学生。然后可以将书籍和 dvd 发给学生。书籍、DVD 和学生被写入一个 .dat 文件。

我遇到的问题是该程序似乎没有将学生写入 .dat 文件,因此当我搜索学生或尝试发行一本书学生时,它找不到学生,它给我一个错误,说找不到学生。谁能告诉我我做错了什么。

我在下面包含了一些代码。 main.cpp

#include <iostream>
#include "Library.h"

int main() {
Library lib1;
while(1)
{
char studentOption;
char name[30];

std::cout<<"1 to add a new student\n";
std::cout<<"2 to search for a student\n";

std::cin.getline( name, 80);
studentOption = name[0];

switch(studentOption){
case '1':
lib1.insertStudent();
break;
case '2':
char regno[6];
std::cout<<"Enter the registration no. of the student you want to search: \n";
std::cin>>regno;
lib1.searchStudent(regno);
break;
}
};

return 0;
};

库.h

#ifndef _Library_H_
#define _Library_H_
#include <stdio.h>

class Library
{
public:
void insertStudent();
void searchStudent(char regno[]);
};

#endif

库.cpp

 #include <iostream>
#include <fstream>
#include "Library.h"
#include "Student.h"

Student student1;

void Library::insertStudent()
{
std::fstream file;
file.open("student.dat",std::ios::out|std::ios::app);
student1.newStudent();
file.write((char*)&student1,sizeof(Student));
file.close();
}

void Library::searchStudent(char regno[])
{
std::fstream file;
int flag=0;
file.open("student.dat",std::ios::in);
while(file.read((char*)&student1,sizeof(Student)))
{
if((strcmp(student1.retregistrationNo(),regno)==0))
{
student1.displayStudent();
flag=1;
}
}

file.close();
if(flag==0)
std::cout<<"Error: Student not found in the system. \n";
}

学生.cpp

#include "Student.h"
void Student::newStudent()
{
std::cout<<"Enter the registration no. \n";
std::cin>>registrationno;
std::cin.ignore();
std::cout<<"Enter the name of the student \n";
fgets(name, sizeof(name), stdin);
stbookbar[0]='/0';
std::cout<<"Student added to system.\n";
}
void Student::displayStudent()
{
std::cout<<"Enter the registration no. : \n";
std::cin>>registrationno;
std::cin.ignore();
std::cout<<"Enter the name of the student: \n";
puts(name);
}

学生.h

#ifndef STUDENT_H_
#define STUDENT_H_

#include <iostream>
#include <fstream>

class Student
{
char registrationno[6];
char name[20];
char stbookbar[6];
char stdvdbar[6];
public:
void newStudent();
void displayStudent();

char* retregistrationNo()
{
return registrationno;
}
};
#endif

最佳答案

虽然以下可能不是您问题的确切原因,但它们可能会导致问题。

使用字符串而不是字符*

使用 C 风格 (char *) 字符串可能会导致程序失败的方式有很多种。还有内存管理的问题。

使用 std::string反而。如果您需要固定记录长度,可以在写入数据时处理。所有其他时间你应该使用 std::string .

此外,您可以使用 operator ==std::string而不是 strcmp . strcmp如果两个字符串不是 nul 终止,函数将调用未定义的行为。

避免fgets

fgets 存在缓冲区溢出和其他问题.使用 std::getlinestd::string反而。此组合将根据需要处理扩展字符串。这样更安全。

不要越过溪流

保持一致,使用 C++ 流或 C 风格的 I/O,不要将两者混用。例如,您使用 cout在同一个函数中,puts .两者有可能使用不同的 I/O 缓冲区。我不明白你为什么不使用 cout << name; .

使用 bool 类型,而不是 1 和 0

C++ 语言有一个类型来表示 truefalse值。类型是 bool , 用它。 bool 值的 1 和 0 表示太过时了(大约在 1966 年)。继续阅读更具可读性的代码。

对于整数,值 3 是真还是假? -1 呢?通过阅读代码,将整数设置为 0 的原因比将 bool 变量设置为 false 的原因多得多。

可读代码可以防止许多缺陷。

始终使用 block 语句。

全部if, for, while, do-while应该使用 block 将您的编码风格更改为对单行和多行语句使用“{”和“}”。

避免魔数(Magic Number)

魔数(Magic Number) 是一个没有任何描述的数字常量。更喜欢命名标识符。命名标识符使代码更易于阅读和维护。

例如,假设您有一个容量为 23 个字符的文本字段。如果将容量更改为 32,则必须找到每次出现的 23,确定该实例是否适用于文本字段,然后修改它们。使用命名标识符,您只需进行 1 处更改,这就是声明标识符的位置。

使用调试器

现在花时间学习使用调试器。您自己会更快地找到问题,而不必等待别人回答您​​的帖子。

使用测试用例

设计您的程序,使其可以读取测试用例。将您的数据放入文件并将其提供给您的程序。创建通过的测试用例。 创建无效的测试用例,这些会破坏您的程序。您的程序可以处理无效输入吗?

测试用例允许自动测试您的程序。它们还允许在您调试问题时进行一致的操作。

编辑 1:比较字符串
示例:

std::string s1 = "Taco";
std::string s2 = "Salad";
if (s1 == s2)
{
cout << "s1 == s2\n";
}
if (s1 == "burrito")
{
cout << "s1 == burrito\n";
}

关于c++ - 为什么我的图书馆管理程序没有写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29517707/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com