c++ - 使用 ifstream 检索引号内的完整字符串

标签 c++ string file-io

我正在尝试创建一个函数来加载代表菜单的一组数据。文件的布局如下所示:

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/

相关文章:

java - 如何在Java中对Spark DataFrame应用字符串操作

java - 无法从 SD 卡读取保存的对象

file-io - Emacs - 当文件被外部修改时通知

c++ - c++ 标准是否禁止 void main() 原型(prototype)?

c++ - Stroustrup 第 4 章练习 6 : Improve efficiency

java - 为什么我得到 null 作为字符串输出?

c# - 是否有一种直接的方法来组合表示 15 分钟时间 block 的连续字符串值?

Python字符串处理优化

c++ - 使用 Remove 删除文件 - C++

c++ - sscanf 未在此范围内声明 - Eclipse、C++