在C++中从格式化到非格式化输入切换
问题描述:
我有一个输入文本文件。第一行有两个int
号码a
和b
,第二行是一个字符串。我想使用格式化输入来执行file >> a >> b
,然后使用未格式化的输入逐个获取字符串的字符。在这两个步骤之间,我需要跳过第一行末尾的'\n'
字符。我用在C++中从格式化到非格式化输入切换
while(file.get()<=' ' && !file.eof()); // skip all unprintable chars
if(!file.eof()) file.unget(); // keep the eof sign once triggered
使输入格式更加灵活。用户现在可以使用任意数量的空行'\n'
,制表键'\t'
和/或空格键' '
将字符串a
和b
与字符串分开 - 他具有将数字a
和b
分开的相同自由度。在Linux中读取从Windows复制的文本文件时,甚至没有任何问题,现在每行末尾都变成"\r\n"
。
是否有一个ifstream
函数可以做同样的事情(跳过所有字符<=' '
,直到到达下一个可打印字符或EOF
)? ignore
函数似乎没有这样做。
答
是的,有:std::ws
操纵器。它跳过空白字符,直到找到非空白字符或到达尾流。它与scanf
格式字符串中使用空格字符类似。
事实上,在实际开始解析字符之前,它被格式化输入使用。
可以使用它这样:
int x;
std::string str;
std::cin >> x >> std::ws;
std::getline(std::cin, str);
//...
//std::vector<int> vec;
for(auto& e: vec) {
std::cin >> e;
}
std::getline(std::cin >> std::ws, str);
空白没有被定义为'
将一个向量指定为硬编码的'n'阵列 –
@LightnessRacesinOrbit它实际上是用户提供的尺寸为VLA:P。但是固定的。 –