【问题标题】:Need program to search through an entire text file需要程序来搜索整个文本文件
【发布时间】:2017-09-24 03:49:49
【问题描述】:

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

// 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

这里是测试这个函数的主类的代码sn-p。 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 函数都导致错误。这是当前的输出:

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

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

【问题讨论】:

  • 请发帖minimal reproducible exampleaddEntry 与尝试完整读取文件有什么关系?要么你阅读了整个文件,要么你没有。如果你这样做了,那么问题与读取文件无关。
  • 你读完第一行就回来了。将 return false 移到 while 循环之外。

标签: c++ file text


【解决方案1】:

while 子句中,您在ifelse 部分都调用了return。这将完全结束函数的处理。 while 子句无法到达第二次迭代。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • continue 没有任何作用,后面没有代码可以跳过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2021-12-10
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多