sstream 字符串错误输出
sstream string wrong output
我正在尝试使用 sstream 读取一个由三个数字组成的字符串,但是当我尝试打印它们时,我得到一个包含四个数字的错误输出。
代码:
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string a("1 2 3");
istringstream my_stream(a);
int n;
while(my_stream) {
my_stream >> n;
cout << n << "\n";
}
}
输出:
1
2
3
3
为什么我在输出中得到四个数字,而在输入字符串中得到三个数字?
您正在打印数据,然后再检查读取是否成功。
while(my_stream) {
my_stream >> n;
应该是
while(my_stream >> n) {
相关(似乎不重复,因为此处未使用 eof()
):
c++ - Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())
) considered wrong? - Stack Overflow
这里
while ( my_stream )
如果没有 I/O 错误,my_stream
可转换为 bool
和 returns true
。
参见:https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool
所以,在最后一次读取之后,还没有 I/O 错误,所以它再次迭代并且有一个错误,并且在这个语句中没有读入 n
:
my_stream >> n;
并且,std::cout
再次打印最后提取的值,即 3。
解决方法可以是读入while
后直接检查I/O错误(首选):
while ( my_stream >> n )
{
std::cout << n << '\n';
}
或者,仅在使用 if
:
读取成功时打印
while ( my_stream )
{
if ( my_stream >> n ) // print if there's no I/O error
{
std::cout << n << '\n';
}
}
示例(live):
#include <iostream>
#include <sstream>
int main()
{
std::string a { "1 2 3" };
std::istringstream iss{ a };
int n {0};
while ( iss >> n )
{
std::cout << n << '\n';
}
return 0;
}
输出:
1
2
3
相关:Why is "using namespace std;" considered bad practice?
我正在尝试使用 sstream 读取一个由三个数字组成的字符串,但是当我尝试打印它们时,我得到一个包含四个数字的错误输出。
代码:
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string a("1 2 3");
istringstream my_stream(a);
int n;
while(my_stream) {
my_stream >> n;
cout << n << "\n";
}
}
输出:
1
2
3
3
为什么我在输出中得到四个数字,而在输入字符串中得到三个数字?
您正在打印数据,然后再检查读取是否成功。
while(my_stream) {
my_stream >> n;
应该是
while(my_stream >> n) {
相关(似乎不重复,因为此处未使用 eof()
):
c++ - Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())
) considered wrong? - Stack Overflow
这里
while ( my_stream )
如果没有 I/O 错误,my_stream
可转换为 bool
和 returns true
。
参见:https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool
所以,在最后一次读取之后,还没有 I/O 错误,所以它再次迭代并且有一个错误,并且在这个语句中没有读入 n
:
my_stream >> n;
并且,std::cout
再次打印最后提取的值,即 3。
解决方法可以是读入while
后直接检查I/O错误(首选):
while ( my_stream >> n )
{
std::cout << n << '\n';
}
或者,仅在使用 if
:
while ( my_stream )
{
if ( my_stream >> n ) // print if there's no I/O error
{
std::cout << n << '\n';
}
}
示例(live):
#include <iostream>
#include <sstream>
int main()
{
std::string a { "1 2 3" };
std::istringstream iss{ a };
int n {0};
while ( iss >> n )
{
std::cout << n << '\n';
}
return 0;
}
输出:
1
2
3
相关:Why is "using namespace std;" considered bad practice?