我正在编写图书馆管理系统的顺序程序,该程序由 两个结构(书籍和学生)和几个功能 组成。
除非我尝试在结构图书的 add_new_book()函数中使用控制台输入,否则一切都会正常工作,它会跳过接受输入。我之前做过研究,然后使用函数 cin.ignore()。该函数适用于前两个字符串输入,但在获取前两个输入后,它会跳过剩余的输入行并终止该函数。
以下是结构书和函数add_new_book()的代码
struct books{
int book_id;
string book_name;
string author_name;
string subject;
int fine;
};
void add_new_book(){
struct books b;
cout << "Enter the Book Name : ";
getline(cin, b.book_name);
cin.ignore();
//cin >> b.book_name;
cout << "Enter Author's Name : ";
getline(cin, b.author_name);
cin.ignore();
cout << "Enter Book id : ";
cin >> b.book_id;
cout << "Enter Book Cost : ";
cin >> b.fine;
cin.ignore();
cout << "Enter the Subject : ";
getline(cin, b.subject);
cout << "\n",b.book_name,b.author_name,b.book_id,b.fine,b.subject;
cout << "\n\n\t\t SUCCUSSFULLY ADDED \n";
// open a file in write mode.
ofstream outfile;
outfile.open("book1.txt");
outfile << b.book_name << endl;
outfile.close();
admin();
}
答案 0 :(得分:1)
我建议摆脱cin.ignore
并使用getline作为数字字段,使用std :: string作为临时缓冲区:
string s;
cout << "Enter Book id : ";
//cin >> b.book_id;
getline(cin, s);
在字符串中输入用户输入后,检查其值并最终将其分配给struct字段,例如必须将book id转换为int,这样:
b.book_id = std::atoi(s.c_str());
如果不能执行转换,atoi将返回零
if(b.book_id == 0)
{
cout << "Invalid book id";
}
此外,cout
并不意味着以您的方式使用。我会尝试干净整洁的东西,像这样:
cout << "Title : " << b.book_name << endl;
cout << "Author: " << b.author_name << endl;
//etc ...
答案 1 :(得分:0)
您不应在std::cin.ignore()
之后致电std::getline()
。 getline
将从该行末尾的输入流中提取'\n'
。调用ignore
将提取并丢弃另一个行。