更改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 關注
- 1512 瀏覽
添加回答
舉報
0/150
提交
取消