C++使用STL自定义输入流分隔符

小码农,你是否有很多问号,为什么别人在那写逻辑,你却在学读文件。

那么,就让ctype加imbue加locale来拯救你吧

废话不多说

先上神奇的代码

#include <locale>
#include <istringstream>

class FilterCharacter : public std::ctype<char>
{
public:
FilterCharacter(const std::string& flag): std::ctype<char>(getTable(flag), true){}
private:
std::ctype_base::mask const* getTable(const std::string& flag)
{
std::ctype_base::mask* table = new std::ctype_base::mask[std::ctype<char>::table_size];
std::fill_n(table, std::ctype<char>::table_size, std::ctype_base::mask());
for(size_t i=0;i<flag.size();i++)
{
table[flag[i]] = std::ctype_base::space;
}
return table;
}
};

void main() {
std::istringstream strstream;
strstream.imbue(std::locale(std::locale(),new FilterCharacter(", ;")));
strstream.sync_with_stdio(false);

strstream.str("123 是,一个,好;\n数\r字");

int yes;std::string shi,yige,hao,shu,zi
strstream>>yes>>shi>>yige>>hao>>shu>>zi;
std::cout<<yes<<shi<<yige<<hao<<shu<<zi;
//输出:123是一个好数字
}

以上代码是否治好了你多年的腰间盘突出?

回车与换行的区别

缩写 ASCⅡ转义 系统 ASCⅡ值 含义
CR \r MacIntosh(早期的Mac) 13 Carriage Return,表示回车
LF \n Unix/Linux/Mac OS X 10 Linefeed,表示换行
CRLF \r\n Windows 表示回车并换行

20220726164810

Windows操作系统采用两个字符来进行换行,即CRLF;

Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;

另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。

许多现代的文本编辑器和命令行工具都提供了可选择的换行符配置,方便用户按照自己的意愿来改变换行符的表现形式,所以我们只需要知道CRLF、CR、LF的作用即可。

野史

20220726165035

据野史记载,在很久以前的机械打字机时代,CR和LF分别具有不同的作用:LF会将打印纸张上移一行位置,但是保持当前打字的水平位置不变;CR则会将“Carriage”(打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。

当CR和LF组合使用时,则会将打印纸张上移一行,且下一个打字位置将回到该行的最左侧,也就是我们今天所理解的换行操作。

随着时间的推移,机械打字机渐渐地退出了历史舞台,当初的纸张变成了今天的显示器,打字机的按键也演变为了如今的键盘。在操作系统出现的年代,受限于内存和软盘空间的不足,一些操作系统的设计者决定采用单个字符来表示换行符,如Unix的LF、MacIntosh的CR。他们的意图都是为了进行换行操作,只是当初并没有一个国际标准(或者其他原因,鬼知道),所以才有这样字符上的不同。