所有的istreams都像`cin`一样跳过白色空间吗?

时间:2015-04-08 08:17:48

标签: c++ input format

据我所知std::cin跳过所有空格,所有其他std::istreamstd::fstreamstd::sstreamstd::iostream个对象就是这种情况,他们跳过白色空间吗?例如,如果要从包含空格分隔值的文件中读取,是否需要以指定任何其他输入格式结构的相同顺序指定跳过?

示例,如果您以(val1,val2)格式读取值:

char par1, comma, par2;
double x,y;
is >> par1 >> x >> comma >> y >> par2;
// check if any input
if(!is) return is;
// check for valid input format
if (par1 != '(' || comma != ',' || par2 != ')')

对于空格分隔值,是否需要指定空格作为格式标记?

int val1;
char whSp= ' '; // or string whSp = " "; 
is >> val1 >> whSp;

2 个答案:

答案 0 :(得分:4)

默认为yes,尽管此行为由基类std::ios_base控制。当流通过调用init初始化其缓冲区时,它还将设置skipws标志(以及其他内容);格式化输入函数(例如operator>>)使用此标志来确定是否跳过空格。除非直接或通过操纵器修改此标志,否则格式化的函数将始终跳过空格。

enter image description here

对于哪些字符被视为空格,这取决于调用函数时流中所充满的语言环境的ctype方面,对于默认的C语言环境(实际上大多数语言环境),这些都是\ t,\ n,\ v,\ f,\ r \ n和空格。

答案 1 :(得分:2)

  

据我所知,cin会跳过所有空白区域,其他所有情况都是如此:fstream,sstream,iostream,它们是否会跳过空格?

所有标准流类型(关于空格)的行为是相同的(否则它们会破坏Liskov替换原则)。

  

例如,如果要从包含空格分隔值的文件中读取,是否需要按照指定任何其他输入格式结构的顺序指定跳过?

这是一种正确的方法。您还可以使用peekignore跳过字符。

  

对于空格分隔值,是否需要将空格指定为格式标记?

您在此提供的示例不正确。

无论哪种方式,要控制空间控制策略,请查看std::skipws and std::noskipws流操作符。