据我所知std::cin
跳过所有空格,所有其他std::istream
:std::fstream
,std::sstream
,std::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;
答案 0 :(得分:4)
默认为yes,尽管此行为由基类std::ios_base
控制。当流通过调用init
初始化其缓冲区时,它还将设置skipws
标志(以及其他内容);格式化输入函数(例如operator>>
)使用此标志来确定是否跳过空格。除非直接或通过操纵器修改此标志,否则格式化的函数将始终跳过空格。
对于哪些字符被视为空格,这取决于调用函数时流中所充满的语言环境的ctype
方面,对于默认的C语言环境(实际上大多数语言环境),这些都是\ t,\ n,\ v,\ f,\ r \ n和空格。
答案 1 :(得分:2)
据我所知,cin会跳过所有空白区域,其他所有情况都是如此:fstream,sstream,iostream,它们是否会跳过空格?
所有标准流类型(关于空格)的行为是相同的(否则它们会破坏Liskov替换原则)。
例如,如果要从包含空格分隔值的文件中读取,是否需要按照指定任何其他输入格式结构的顺序指定跳过?
这是一种正确的方法。您还可以使用peek和ignore跳过字符。
对于空格分隔值,是否需要将空格指定为格式标记?
您在此提供的示例不正确。
无论哪种方式,要控制空间控制策略,请查看std::skipws and std::noskipws流操作符。