如何从文本文件中的一行中间读取句子并将其存储到单个字符串中?[复制]

How can I read sentences from the middle of a line in text file and store it into a single string? [duplicate]

提问人:dailypassby 提问时间:8/23/2023 最后编辑:Vlad from Moscowdailypassby 更新时间:8/24/2023 访问量:57

问:

嗨,我有一个文本文件,它应该是要创建的新游戏项目的数据,它看起来像这样:

1 Sword 5 10
2 Bow 5 10
3 Axe 5 10
4 Shield 5 10
5 Spear 5 10

我知道如何读取每个由空格分隔的单独片段并将它们存储到变量中,但是如果我想使用多个单词作为名称,例如“Big Sword”或“Heavy Bow”,并将其存储为单个字符串,该怎么办?

现在对于我正在使用的每条线

file >> id >> name >> value >> value

但是有没有办法让它,当它到达“名称”部分时,我可以指定它将存储到单个字符串中的单词数量,也可以使用灵活数量的单词来完成,例如“大剑”或“大锈剑”或“大锈重剑”,它仍然会知道这是一个大名字。

我还没有想出任何想法

C++ 文件 文本

评论

0赞 Botje 8/23/2023
如果你的分隔符可以出现在你的个人“片段”中,你要么必须实现引号或转义语义,要么只是改变你的分隔符。
0赞 Botje 8/23/2023
或者,如果你只有一个这样的棋子,你可以把它放在线的末尾,用来抓取线的其余部分。std::getline
2赞 john 8/23/2023
您需要更改文件格式。你没有想出任何想法的原因是你的格式是模糊的(最好的)或固有的模棱两可(最坏的情况)。如果你可以改变格式,那就改变它,如果你不能改变格式,那么问设计这种格式的人你应该怎么做。
1赞 john 8/23/2023
我想到的一个简单的解决方法是用下划线替换空格,例如 然后,您可以在读取字符串后将下划线替换为空格。1 Big_Rusty_Heavy_Sword 5 10

答:

1赞 Vlad from Moscow 8/23/2023 #1

如果您的编译器支持 C++17,那么一个简单的方法是使用标头中声明的操纵器,该操作器允许将字符串存储在引号中。std::quoted<iomanip>

这是一个演示程序。为简单起见,使用字符串流代替文件流。

#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>

int main()
{
    std::ostringstream os;

    os << 1 << ' ' << std::quoted("Big Rusty Heavy Sword") << ' ' 
        << 5 << ' ' << 10;

    unsigned int id;
    std::string name;
    int value1, value2;

    std::istringstream is( os.str() );

    is >> id >> std::quoted( name ) >> value1 >> value2;

    std::cout << "id = " << id << ", name = " << name
        << ", value1 = " << value1 << ", value2 = " << value2
        << '\n';
}

程序输出为

id = 1, name = Big Rusty Heavy Sword, value1 = 5, value2 = 10

也就是说,您需要使用操纵器来存储一个多字字符串,然后使用操纵器来读取字符串。std::quoted

例如,您可以使用标准函数从文件中读取整行,然后使用基于该行的输入字符串流来读取单独的项目。std::getline