与我正在搜索的结果不同 我写的C++控制台程序必须在一个二进制文件中按名称搜索一组人,并显示所有记录的数据。问题是,当我搜索一个名字,例如第三个或第四个,程序总是显示第一个

与我正在搜索的结果不同 我写的C++控制台程序必须在一个二进制文件中按名称搜索一组人,并显示所有记录的数据。问题是,当我搜索一个名字,例如第三个或第四个,程序总是显示第一个,c++,C++,您也可以在这些图片上看到问题: void search_by_name() { { 存款人p_信息; 字符名[50]; 数据文件打开(“info.dat”,ios::binary | ios::in); 如果(!数据_文件) { cout该函数只读取第一条记录(从文件的第0字节到sizeof(存款人)),但它从不读取存款人姓名从cin读取的行之后的文件,因此它不可能从文件中获取除第一条记录以外的任何数据 p_Info.full_name == name 这不是C++中字符串比较的正确方法

您也可以在这些图片上看到问题:

void search_by_name()
{
{
存款人p_信息;
字符名[50];
数据文件打开(“info.dat”,ios::binary | ios::in);
如果(!数据_文件)
{

cout该函数只读取第一条记录(从文件的第0字节到
sizeof(存款人)
),但它从不读取存款人姓名从
cin
读取的行之后的文件,因此它不可能从文件中获取除第一条记录以外的任何数据

 p_Info.full_name == name
<>这不是C++中字符串比较的正确方法。 例如,使用strcmp(p_Info.full_name,name)==0
,或者使用
std::string
。 哦,是的,还有,我想,你想把这条线放在while循环和现在的位置:

data_file.read((char*)(&p_Info), sizeof(depositor));
while循环应如下所示:

//while we didn't find the right one, continue reading
while(strcmp(p_Info.full_name, name) != 0)
    data_file.read((char*)(&p_Info), sizeof(depositor));

0*sizeof(结构储户)
始终是
0
,因此
p_Info
将始终包含第一条
存款人
记录。您还期待什么?请发布
存款人
。根据具体情况,整个方法可能无效。您真的应该停止发布一段时间,并使用调试器。您将学到很多东西,并捕获大量数据程序中的影响。while循环要么找不到任何东西,要么将无限循环,因为您从未更改循环中的任何一个变量。调试器、调试器、调试器…我应该如何更改算法以便获得搜索的结果?您可以先考虑Barmar的注释,然后尝试单步执行代码正如托马斯·马修斯(Thomas Matthews)明智地建议的那样,使用调试器。问问自己“我想用每一行实现什么?”当你通过代码时,问问你自己这行是否真的做了你想要的。为了避免这个陷阱,<代码> STD::String 可以使用。我同意,只要有可能,但是我认为在这种情况下使用STRCMP更容易。@马尔科你保存了我的A**!谢谢!但是你也应该考虑FI中没有这样的名字的情况。le,则到达文件结尾(eof()),但未成功。还应包括检查文件结尾。当文件中没有具有请求名称的p_信息时,将发生错误,因此必须防止这种情况。正如许多人建议的那样,学习如何使用调试器(在IDE中)。然后逐步了解程序的工作方式。
//while we didn't find the right one, continue reading
while(strcmp(p_Info.full_name, name) != 0)
    data_file.read((char*)(&p_Info), sizeof(depositor));