【发布时间】:2022-01-21 19:49:50
【问题描述】:
我有一个问题,我一直无法找到解决的好方法,主要是因为我对 C++ 比较陌生,但对编程并不陌生。我有一个包含几行的文件,其中之一是:
Plain Egg 1.45
我需要能够读取该行并将第一部分“Plain Egg”拆分为一个字符串,然后将最后一部分 1.45 拆分为一个浮点数,然后对其余行执行此操作。以下是我到目前为止的一些代码,但由于某种原因它甚至拒绝读取文件时遇到了问题:
string line;
ifstream menuFile("menu.txt");
if (menuFile.is_open())
{
int i = 0;
while (getline(menuFile, line));
{
cout << line << endl;
istringstream iss(line);
iss >> dataList[i].menuItem >> dataList[i].menuPrice;
/*iss >> dataList[i].menuPrice;*/
i++;
}
}
else
{
cout << "Unable to open file.";
}
当我运行它时,它不会吐出“无法打开文件。”,当我跟踪它时,它确实进入了 if 循环,但它只是不读取它。除了这个问题,我想知道这段代码是否会按照我想要的方式工作,如果没有,如何解决这个问题。
编辑:当我运行它时,它会输出文件最后一行所说的内容,即“Tea 0.75”。完整文件如下:
Plain Egg 1.45
Bacon and Egg 2.45
Muffin 0.99
French Toast 1.99
Fruit Basket 2.49
Cereal 0.69
Coffee 0.50
Tea 0.75
编辑2:出于某种原因,以下代码直接进入最后一行,Tea 0.75,我不知道为什么,getline 不应该逐行直到最后一行(?):
string line;
int index;
ifstream menuFile("menu.txt");
if (menuFile.is_open())
{
while (getline(menuFile, line));
{
cout << line << endl;
index = line.find_last_of(' ');
cout << index << endl;
}
}
编辑 3:上面的代码在 while 循环的末尾有一个分号,难怪它只是在最后一行结束,呃。
【问题讨论】:
-
因为协议使用空格作为分隔符,并且还允许标记中的空格,所以您需要花费额外的精力来查找不变的部分并以它们开头。在这种情况下,最后一个标记将始终是一个浮点数。从行尾开始,向后解析浮点数。其余的将是字符串。
-
你可以用一个非常直接的 std::regex,或者一个不太难的自定义解析例程,或者一个非常简单的 Boost Spirit X3 语法来解决这个问题。取决于您的舒适程度和需求。
-
这是一个很棒的建议,我现在要搜索它,但是从行尾读到后面的最佳方法是什么?
-
@BrentMayes:是的,您使用
getline的方式很好。您只需处理getline成功后执行的代码。 -
@user4581301
std::string::rfind()在这种情况下比std::string::find_last_of()更合适。