C++中使用std::ifstream读取字符串分隔符

3

使用时:

string s;
cin >> s;

字符串可以包含哪些字符,哪些字符会停止读取字符串。

2个回答

10

std::ctype_base::spacestd::istream 中用于分隔符的,它使得读取源中的更多字符停止。

std::ctype_base::space 指的是空格和换行符。也就是说,当使用 cin>>s 读取时,s 可以包含除空格和换行符以外的任何字符。

如果你想要读取包含空格的完整行,那么可以使用 getline() 函数,该函数使用换行符作为分隔符。此外,还存在其重载函数,如果您想提供自己的分隔符,则可以使用它。有关详细信息,请参阅其文档


您还可以使用自定义的区域设置(locale),并将其设置为 std::istream。您的自定义区域设置可以定义一组在 std::istream 中被视为分隔符的字符。您可以在这里看到一个示例(请参见我的解决方案):

正确将 std::string 拆分为 vector<string> 的方式


我认为我明白你想说什么,但是std::ctype_base::space是一个枚举类型,并且是一个掩码值,它只能作为std::ctype<>::is的参数使用。而这又取决于imbued locale,理论上可以做任何事情。 - James Kanze
@James:嗯...我明白了。我的编辑版本(水平线后面)可能解释得更清楚? :-/ - Nawaz
1
是的,尽管我认为你提到的解决方案是滥用。需要记住的重要事情是:1)空格是分隔符,2)被视为空格的内容取决于流中所包含的语言环境。 - James Kanze

3
分隔符是任何字符ch,其返回值为true的函数std::isspace(ch, std::sin.getlocale())。换句话说,它是被注入区域认为是“空格”的任何字符。(虽然我认为这有点滥用,但我知道程序员会创建特殊的区域,将例如,视为空格,并使用>>读取逗号分隔的列表。)

我想我在这里滥用了它(这真的算滥用吗?):https://dev59.com/jm035IYBdhLWcg3wH8Ul - Nawaz
@James:如何使用imbued locale来解析数字?你能解释一下吗? - Nawaz
@James:我没明白。让我重述一下我的问题:如果我只想从一个文本文件中读取数字,我该怎么做? - Nawaz
@James:file >> number会忽略非数字字符,例如简单的英语句子吗? - Nawaz
@Nawaz 我不确定我理解了。你正在阅读的任何文件都会有一定的定义格式。您必须读取所有数据以确定它是否符合该格式。读取一些随机数据并提取任何看起来像整数的东西并不优雅。 - James Kanze
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接