- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个图书馆管理系统,您可以在其中添加书籍、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::getline
和 std::string
反而。此组合将根据需要处理扩展字符串。这样更安全。
保持一致,使用 C++ 流或 C 风格的 I/O,不要将两者混用。例如,您使用 cout
在同一个函数中,puts
.两者有可能使用不同的 I/O 缓冲区。我不明白你为什么不使用 cout << name;
.
C++ 语言有一个类型来表示 true
和 false
值。类型是 bool
, 用它。 bool 值的 1 和 0 表示太过时了(大约在 1966 年)。继续阅读更具可读性的代码。
对于整数,值 3 是真还是假? -1 呢?通过阅读代码,将整数设置为 0 的原因比将 bool 变量设置为 false 的原因多得多。
可读代码可以防止许多缺陷。
全部if, for, while, do-while
应该使用 block 将您的编码风格更改为对单行和多行语句使用“{”和“}”。
魔数(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/
假设有这样一段代码。 MOV [0x1234], EAX (intel assembly) 假设 CPU 要处理这条指令。假设没有管理程序。我们只是在 linux 环境中使用普通的 x86 CPU(保
我尝试在 Linux 上按照这篇文章安装英特尔硬件辅助虚拟化(管理程序): How to Start Intel Hardware-assisted Virtualization (hyperviso
我是一名优秀的程序员,十分优秀!