更改cin的分隔符(c ++)我已经重定向“cin”来从文件流中读取cin.rdbug(inF.rdbug()) 当我使用提取操作符时,它会读取直到它到达空格字符。是否可以使用另一个分隔符?我在cplusplus.com上浏览了api,但没有找到任何东西。
3 回答
阿波罗的战车
TA贡献1862条经验 获得超6个赞
这是Robᵩ的答案的改进,因为这是正确的(我很失望,它没有被接受。)
您需要做的是更改ctype
查看的数组以确定分隔符是什么。
在最简单的情况下,您可以创建自己的:
const ctype<char>::mask foo[ctype<char>::table_size] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ctype_base::space};
在我的机器上'\n'
是10.我已将数组的元素设置为分隔符值:ctype_base::space
。一个ctype
与初始化foo
只会划上'\n'
没有' '
或'\t'
。
现在这是一个问题,因为传入的数组ctype
定义的不仅仅是分隔符,它还定义了leters,数字,符号以及流式传输所需的其他垃圾。(Ben Voigt的答案触及了这一点。)所以我们真正想做的是修改 a mask
,而不是从头开始创建。
这可以这样完成:
const auto temp = ctype<char>::classic_table();vector<ctype<char>::mask> bar(temp, temp + ctype<char>::table_size);bar[' '] ^= ctype_base::space;bar['\t'] &= ~(ctype_base::space | ctype_base::cntrl);bar[':'] |= ctype_base::space;
一个ctype
与初始化bar
将划上'\n'
和':'
,但不会' '
还是'\t'
。
您可以像以下一样设置cin
或istream
使用您的自定义ctype
:
cin.imbue(locale(cin.getloc(), new ctype<char>(data(bar))));
您还可以在ctype
s 之间切换,行为将在流中改变:
cin.imbue(locale(cin.getloc(), new ctype<char>(foo)));
如果您需要返回默认行为,请执行以下操作:
cin.imbue(locale(cin.getloc(), new ctype<char>));
Live example
- 3 回答
- 0 关注
- 1446 浏览
添加回答
举报
0/150
提交
取消