更改cin的分隔符(c ++)

更改cin的分隔符(c ++)

我已经重定向“cin”来从文件流中读取cin.rdbug(inF.rdbug()) 当我使用提取操作符时,它会读取直到它到达空格字符。

是否可以使用另一个分隔符?我在cplusplus.com上浏览了api,但没有找到任何东西。


ABOUTYOU
浏览 1447回答 3
3回答

弑天下

对于字符串,您可以使用std::getline重载来使用不同的分隔符进行读取。对于数字提取,分隔符实际上不是“空白”,而是数字中无效的任何字符。

阿波罗的战车

这是Robᵩ的答案的改进,因为这是正确的(我很失望,它没有被接受。)您需要做的是更改ctype查看的数组以确定分隔符是什么。在最简单的情况下,您可以创建自己的:const&nbsp;ctype<char>::mask&nbsp;foo[ctype<char>::table_size]&nbsp;=&nbsp;{0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;ctype_base::space};在我的机器上'\n'是10.我已将数组的元素设置为分隔符值:ctype_base::space。一个ctype与初始化foo只会划上'\n'没有' '或'\t'。现在这是一个问题,因为传入的数组ctype定义的不仅仅是分隔符,它还定义了leters,数字,符号以及流式传输所需的其他垃圾。(Ben Voigt的答案触及了这一点。)所以我们真正想做的是修改&nbsp;a&nbsp;mask,而不是从头开始创建。这可以这样完成:const&nbsp;auto&nbsp;temp&nbsp;=&nbsp;ctype<char>::classic_table();vector<ctype<char>::mask>&nbsp;bar(temp,&nbsp;temp&nbsp;+&nbsp;ctype<char>::table_size);bar['&nbsp;']&nbsp;^=&nbsp;ctype_base::space;bar['\t']&nbsp;&=&nbsp;~(ctype_base::space&nbsp;|&nbsp;ctype_base::cntrl);bar[':']&nbsp;|=&nbsp;ctype_base::space;一个ctype与初始化bar将划上'\n'和':',但不会' '还是'\t'。您可以像以下一样设置cin或istream使用您的自定义ctype:cin.imbue(locale(cin.getloc(),&nbsp;new&nbsp;ctype<char>(data(bar))));您还可以在ctypes&nbsp;之间切换,行为将在流中改变:cin.imbue(locale(cin.getloc(),&nbsp;new&nbsp;ctype<char>(foo)));如果您需要返回默认行为,请执行以下操作:cin.imbue(locale(cin.getloc(),&nbsp;new&nbsp;ctype<char>));Live example
打开App,查看更多内容
随时随地看视频慕课网APP