需要程序来搜索整个文本文件

Need program to search through an entire text file

本文关键字:文本 文件 搜索 程序      更新时间:2023-10-16

很长的帖子,但是我很难让这个程序读取整个文本文件,而不是看起来像第一行。

// return true only if the code is valid
bool PriceList::isValid(string code) const {
    ifstream myfile;
    string line;
    myfile.open("pricelist.txt");
    if (myfile.is_open()) {
        while (getline(myfile,line))
        {
            if (line.find(code) != string::npos)
            {
                cout << line <<endl;
                return true;
            }
            else
            {
                cout << line <<endl;
                return false;
            }
        }
    }
    else
        throw invalid_argument("Could not open file");
} 

该程序的这一部分的目的是确定是否存在文本文件中的产品条代码。这是给我们的文本文件(Pricelist.txt)的一部分(从左到右的类别是名称,条形码,价格和应税):

Soda_can    1035851680  2.29    1
Red_Cabbage 1163115674  1.99    0
Tomato_Sauce    1195034963  0.29    0
Tuna_chunky_in_water    1304271912  0.59    0
Salad_Dressing  1352230364  1.39    0

这是测试此功能的主类的代码段。Addentry行调用了我已经编码的Addentry函数,将每个项目添加到文本文件末尾(我们主要关注条形码数据值,即1000,2000)。testanswer行调用函数以说明该函数是否正确运行。第一个数据值是测试的标题,第二个数据值是要测试的变量,第三个是函数应产生的值。因此,例如,第一个Testanswer行是在测试条形码1000是否在文本中。文件,结果应该是正确的:

    { PriceList priceList;
    priceList.addEntry("Apples", "1000", 1.99, false);
    priceList.addEntry("Bananas", "2000", 0.99, false);
    testAnswer("PriceList isValid1", priceList.isValid("1000"), true);
    testAnswer("PriceList isValid2", priceList.isValid("19"), false); }

,正如我所说的那样,我很难使程序读取所有文本文件。它似乎只是读取第一行,苏打水can,并且会导致两个testanswer函数导致错误。这是当前的输出:

Soda_can        1035851680      2.29    1
FAILED PriceList isValid1: expected 1 but received 0
Soda_can        1035851680      2.29    1
PASSED PriceList isValid2: expected and received 0

如果我手动将苹果和香蕉数据值放在最顶部会产生正确的值,但显然我想使其适用于文本文件上任何地方的任何项目。我花了几个小时来解决这个问题,这是我现在得到的最好的。我非常感谢您的任何帮助,我感谢您阅读所有这些帮助。让我知道我的任何解释尚不清楚。

在您的while子句中您在ifelse部分中都调用返回。这将完全结束用于该功能的处理。WARE子句无法达到第二个迭代。

实际问题是您的程序返回,无论代码检查if (line.find(code) != string::npos)

可能,如果找不到代码,您希望继续搜索/阅读文件,并在找到代码后停止读取文件。这应该一直持续到达到EOF

您可以使用其他变量(例如bFound)存储结果并将其返回。如下所示:

    bool bFound = false;
    while (getline(myfile,line))
    {
        if (line.find(code) != string::npos)
        {
            cout << line <<endl;
            bFound = true; 
            break;    //Record found break from loop
        }
        else
        {
            cout << line <<endl;
            continue;    //Record not found. Continue loop.
        }
    }
    return bFound;