Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何搜索记录以按名称或部分名称查找?C++;_C++_Algorithm_Search - Fatal编程技术网

C++ 如何搜索记录以按名称或部分名称查找?C++;

C++ 如何搜索记录以按名称或部分名称查找?C++;,c++,algorithm,search,C++,Algorithm,Search,我有一个结构如下的程序: struct FundData { char fundName[SIZE]; //Fund Name char fundInception[SIZE]; //Fund inception date double ytd; //Year to date return as percent double oneYear; //1 year Return as percent double threeYear; //3 year Ret

我有一个结构如下的程序:

struct FundData
{
    char fundName[SIZE]; //Fund Name
    char fundInception[SIZE]; //Fund inception date
    double ytd; //Year to date return as percent
    double oneYear; //1 year Return as percent
    double threeYear; //3 year Return as percent
    double fiveYear; //5 year Return as percent
    double tenYear; //10 year Return as percent
    double fundExpense; //Fund Yearly Expense as percent
};

FundData newData[5];

我使用菜单将结构的记录添加到文件中,显示所有记录,现在删除记录时遇到问题。我不知道如何使用全名或部分名称搜索记录。我尝试使用seekg,但它不允许我按字符数组进行搜索。我需要按全部或部分基金名称搜索基金,显示该基金的数据,然后提示用户确认删除。但是,我仍停留在第一部分,即查找记录。

有一种方法可以仅使用原始数组来实现这一点

标准库包含各种各样的算法,这些算法适用于大量用例。提供的算法之一正是您要查找的算法:
std::find_if

它是这样使用的:

// put that include in the top of the file
#include <algorithm>

auto the_one_to_find = "name to find";

auto found_element = std::find_if(
    std::begin(newData), std::end(newData),
    [&](const FundData& data) {
        return std::strncmp(data.fundName, the_one_to_find, SIZE);
    }
);

// if the fund has been found
if (found_element != std::end(newData)) {
    std::cout << found_element->fundName; // found it!
}
//将包含的内容放在文件的顶部
#包括
自动选择要查找的名称;
自动查找元素=std::查找元素if(
标准::开始(新数据),标准::结束(新数据),
[&](const FundData&data){
返回std::strncmp(data.fundName,要查找的对象,大小);
}
);
//如果找到了资金
如果(找到元素!=std::end(newData)){
std::cout fundName;//找到了!
}

必须使用C++14才能使用
std::begin
std::end
,它在所有最近的编译器上都可用,并且通常在默认情况下启用。

下面的函数模板
find_name()
执行线性搜索()在传递的
FundData
数组上,查找字符串
name
fundName
的元素。它用于比较字符串,而不是
std::strcmp
array_len()
只是一个方便的函数模板,用于推断内置数组的大小(用于数组数据成员
fundName

模板
大小\u t数组\u len(t(&arr)[N]){
返回N;
}
模板
FundData*查找名称(FundData(&arr)[N],std::string name){
自动pred=[&name](const FundData&data){
return!std::strncmp(data.fundName,name.c_str(),array_len(data.fundName));
};
自动it=std::find_if(std::begin(arr)、std::end(arr)、pred);
if(std::end(arr)==it)
返回空ptr;
返回&*它;
}
然后,您可以这样使用它:

auto main() -> int {
   FundData newData[5];

   // ...

   auto ptr = find_name(newData, "FooBar");

   if (ptr)
      std::cout << ptr->fundName << '\n';
}
auto main()->int{
FundData新数据[5];
// ...
自动ptr=查找_名称(newData,“FooBar”);
如果(ptr)

STD::CUT FUNDIQUE,首先,不要在C++中使用数组,如果是固定长度,尝试使用<代码> STD::数组< /C>,如果使用可变长度,尝试使用<代码> STD::vector < /C> >,而使用C样式数组和指针是很多bug的大门。第二:最简单的方法是使用C++标准库中的算法< /Cult>库。,您可以使用
find_if
,也可以使用for循环在数组中正常迭代。要搜索部分字符串,可以使用
std::search
:我是一个非常基本的介绍类,不幸的是,我们还没有完成任何操作。他们给了我们使用的结构,但我似乎无法搜索文件;我可以搜索通过一个基本数组,但该文件使我感到厌烦。因为看起来您被迫使用字符数组作为字符串。它将与数组1和数组2的前N个字符进行比较,如果它们匹配,则返回true。有关示例,请参阅链接文档页。仔细想想,只有当部分名称必须位于全名的开头。如果你想在“麦当劳”中找到“堂”,你必须更加努力。首先,你要把所有的东西都转换成普通的大小写,否则“堂”和“堂”不匹配@Computer文盲--我需要按全部或部分基金名称搜索基金,显示该基金的数据,然后提示用户确认删除--如果有多个名称与部分搜索匹配怎么办?进行这些部分搜索的“现实世界”方法是构建一个由基金名称组成的(阅读链接中的字典表示部分)。另外,使用字符串本身的
std::begin
std::end
可以将
std::strcmp
替换为
std::search
,至少使用
strncmp
,因为如果字符串没有正确地以null结尾,则可能会导致漏洞
auto main() -> int {
   FundData newData[5];

   // ...

   auto ptr = find_name(newData, "FooBar");

   if (ptr)
      std::cout << ptr->fundName << '\n';
}