我正在尝试创建一个函数来加载代表菜单的一组数据。文件的布局如下所示:
DS 测试菜单
6
菜单“开始”“play.mnu”
菜单“选项”“opt.mnu”
菜单“帮助”“help.mnu”
选项“数据结构项目 1B”
选项“全帆”
选项“游戏设计与开发”
第一行是菜单的标题,第二行是菜单项的数量。 之后的每一行都是该菜单上的一个项目。当提取引号中的每个菜单项的名称时,我的问题就来了。
这是我尝试过的:
ifstream fin;
fin.open(filepath.c_str(), ios_base::in);
if (fin.is_open())
{
getline(fin, this->title);
int numMenuItems;
fin >> numMenuItems;
for (size_t i = 0; i < numMenuItems; i++)
{
menuItem temp;
string menutitle;
fin >> menutitle;
if (menutitle == "MENU")
{
string name, filepath;
fin >> name;
fin >> filepath;
name = name.substr(1, name.length() - 2);
filepath = filepath.substr(1, filepath.length() - 2);
temp.is_subMenu = true;
temp.name = name;
temp.subMenuPath = filepath;
}
else
{
string name;
fin >> name;
name = name.substr(1, name.length() - 2);
temp.is_subMenu = false;
temp.name = name;
}
}
}
这对前 3 个菜单项很有效,当引号中的菜单项名称有几个字长时,我的问题就出现了。我知道这是因为使用提取运算符只提取到第一个空格。我还必须使用字符串 substr 方法来丢失引号。
我不确定是否有更好的方法来提取数据并忽略引号,而且我无法更改数据的存储格式。
提取这些信息的最佳方式是什么?
最佳答案
多亏了@BenVoigt,我才能够让它工作。
if (fin.is_open())
{
getline(fin, this->title);
int numMenuItems;
fin >> numMenuItems;
for (int i = 0; i < numMenuItems; i++)
{
menuItem temp;
string tempshit;
fin >> tempshit;
if (tempshit == "MENU")
{
string name, filepath, temp2;
getline(fin, temp2, '"');
getline(fin, name, '"');
getline(fin, temp2, '"');
getline(fin, filepath, '"');
temp.is_subMenu = true;
temp.name = name;
temp.subMenuPath = filepath;
}
else
{
string name, temp2;
getline(fin, temp2, '"');
getline(fin, name, '"');
temp.is_subMenu = false;
temp.name = name;
}
}
}
关于c++ - 使用 ifstream 检索引号内的完整字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24707991/