【发布时间】: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 example。
addEntry与尝试完整读取文件有什么关系?要么你阅读了整个文件,要么你没有。如果你这样做了,那么问题与读取文件无关。 -
你读完第一行就回来了。将 return false 移到 while 循环之外。