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

时间:2017-09-24 03:49:50

标签: c++ file text

有点长篇文章,但是我很难尝试通过整个文本文件来读取这个程序,而不是看起来只是第一行。

// 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); }

因为我说我无法让程序读取所有文本文件。它似乎只是读取第一行,Soda_can一行,它导致两个testAnswer函数导致false。这是当前的输出:

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

如果我手动将苹果和香蕉数据值放在最顶层,它会产生正确的值,但显然我想让它适用于文本文件中任何位置的任何项目。我花了好几个小时试图解决这个问题,这是我现在最好的。我非常感谢你们的任何帮助,感谢你们阅读所有这些内容。如果我的任何解释都不清楚,请告诉我。

2 个答案:

答案 0 :(得分:0)

while子句中,您在ifelse部分中都要回复。这将完全为该功能结束处理。 while子句无法进入第二次迭代。

答案 1 :(得分:0)

实际问题是您的程序无论代码检查结果如何都会返回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;