有点长篇文章,但是我很难尝试通过整个文本文件来读取这个程序,而不是看起来只是第一行。
// 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
如果我手动将苹果和香蕉数据值放在最顶层,它会产生正确的值,但显然我想让它适用于文本文件中任何位置的任何项目。我花了好几个小时试图解决这个问题,这是我现在最好的。我非常感谢你们的任何帮助,感谢你们阅读所有这些内容。如果我的任何解释都不清楚,请告诉我。
答案 0 :(得分:0)
在while
子句中,您在if
和else
部分中都要回复。这将完全为该功能结束处理。 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;