在 C++ 中从格式化输入切换到未格式化输入
Switching from formatted to unformatted input in C++
我有一个输入文本文件。第一行有两个int
数字a
和b
,第二行是一个字符串。我想先用格式化输入做file >> a >> b
,再用无格式输入把字符串的字符一个一个获取。在这两个步骤之间,我需要跳过第一行末尾的 '\n'
字符。我用了
while(file.get()<=' ' && !file.eof()); // skip all unprintable chars
if(!file.eof()) file.unget(); // keep the eof sign once triggered
使输入格式更加灵活。用户现在可以使用任意数量的空行 '\n'
、Tab 键 '\t'
、and/or [=37] 将数字 a
和 b
从字符串中分离出来=] keys ' '
-- 他有同样的自由来分隔数字 a
和 b
。当行尾现在变成 "\r\n"
.
时,甚至在 Linux 中读取从 Windows 复制的文本文件也没有问题
是否有一个 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);
我有一个输入文本文件。第一行有两个int
数字a
和b
,第二行是一个字符串。我想先用格式化输入做file >> a >> b
,再用无格式输入把字符串的字符一个一个获取。在这两个步骤之间,我需要跳过第一行末尾的 '\n'
字符。我用了
while(file.get()<=' ' && !file.eof()); // skip all unprintable chars
if(!file.eof()) file.unget(); // keep the eof sign once triggered
使输入格式更加灵活。用户现在可以使用任意数量的空行 '\n'
、Tab 键 '\t'
、and/or [=37] 将数字 a
和 b
从字符串中分离出来=] keys ' '
-- 他有同样的自由来分隔数字 a
和 b
。当行尾现在变成 "\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);