Stringstream 没有输入添加了结束符的字符串
Stringstream is not feeding into a string that has a endline character added to it
我基本上是在尝试将整数添加到字符串中,然后在特定时间将结束符添加到字符串中,然后继续添加整数。我希望将其全部添加到一个字符串对象中。
所以我向stringstream 添加了一个int,将stringstream 提供给一个字符串。然后在字符串中添加'\n'。
然后我在stringstream中添加了另一个int,并再次将其提供给string。
不幸的是,stringstream 对象中的第二个对象没有被添加到字符串中,我不确定为什么不能。
我尝试将两个对象添加到我的字符串流对象,然后将它们一次一个地提供给字符串(中间有结束符),但是字符串流一次将字符串中的所有内容都添加到字符串中,所以那行不通。
int main(){
string h;
stringstream ss;
ss << 1;
ss >> h;
h += '\n';
ss << 2;
ss >> h;
h += '\n';
cout << h << "endline";
cout << endl;
return 0;
}
当然没有错误信息。我希望它输出:
1
2
endline
相反我得到
1
endline
很明显,该字符串添加了我的两个结束字符,但没有添加我添加到字符串流中的 2 个字符。
使用stringstream
建立你想要的输出,然后提取字符串。
ss << 1 << '\n';
ss << 2 << '\n';
h = ss.str();
为了演示发生了什么,我们需要检查各种流状态位。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string h;
stringstream ss;
if (ss << 1)
{
cout << "1 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "2 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
h += '\n';
if (ss << 2)
{
cout << "3 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "4 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
h += '\n';
cout << h << "endline";
cout << endl;
}
else
{
cout << "4 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "3 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "2 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "1 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
return 0;
}
输出
1 success. Fail 0 eof 0 bad 0
2 success. Fail 0 eof 1 bad 0
3 Fail 1 eof 1 bad 0
所以第一次写成功了。无懈可击的胜利。但是第一次读取读取了流中的所有内容并到达文件末尾(不是流是文件,而是名称卡住了),设置了 EOF 位。一旦设置了 EOF 位,除了清除该位并祈祷有人添加更多数据以供读取之外,您对流无能为力。
流中添加了更多数据,但由于 EOF 位,文件无法接受它。
如果我们清除EOF
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string h;
stringstream ss;
if (ss << 1)
{
cout << "1 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "2 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
h += '\n';
ss.clear(); // added this
if (ss << 2)
{
cout << "3 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "4 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
h += '\n';
cout << h << "endline";
cout << endl;
}
else
{
cout << "4 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "3 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "2 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "1 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
return 0;
}
现在输出
1 success. Fail 0 eof 0 bad 0
2 success. Fail 0 eof 1 bad 0
3 success. Fail 0 eof 0 bad 0
4 success. Fail 0 eof 1 bad 0
2
endline
如果我们忽略我添加的所有状态信息,我们真的得到了
2
endline
不是想要的
1
2
endline
因为 ss >> h
将覆盖 h
中已有的所有内容。 “1\n”被“2”擦除
获得所需内容的最简单方法是写入所有内容,然后将内容作为 string
。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string h;
stringstream ss;
if (ss << 1 << '\n' << 2 << '\n')
{
cout << ss.str() << "endline";
cout << endl;
}
else
{
cout << "Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
return 0;
}
这次的输出是
1
2
endline
我基本上是在尝试将整数添加到字符串中,然后在特定时间将结束符添加到字符串中,然后继续添加整数。我希望将其全部添加到一个字符串对象中。
所以我向stringstream 添加了一个int,将stringstream 提供给一个字符串。然后在字符串中添加'\n'。
然后我在stringstream中添加了另一个int,并再次将其提供给string。
不幸的是,stringstream 对象中的第二个对象没有被添加到字符串中,我不确定为什么不能。
我尝试将两个对象添加到我的字符串流对象,然后将它们一次一个地提供给字符串(中间有结束符),但是字符串流一次将字符串中的所有内容都添加到字符串中,所以那行不通。
int main(){
string h;
stringstream ss;
ss << 1;
ss >> h;
h += '\n';
ss << 2;
ss >> h;
h += '\n';
cout << h << "endline";
cout << endl;
return 0;
}
当然没有错误信息。我希望它输出:
1
2
endline
相反我得到
1
endline
很明显,该字符串添加了我的两个结束字符,但没有添加我添加到字符串流中的 2 个字符。
使用stringstream
建立你想要的输出,然后提取字符串。
ss << 1 << '\n';
ss << 2 << '\n';
h = ss.str();
为了演示发生了什么,我们需要检查各种流状态位。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string h;
stringstream ss;
if (ss << 1)
{
cout << "1 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "2 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
h += '\n';
if (ss << 2)
{
cout << "3 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "4 success. Fail " << ss.fail()
<< " eof " << ss.eof() << " bad " << ss.bad() << endl;
h += '\n';
cout << h << "endline";
cout << endl;
}
else
{
cout << "4 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "3 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "2 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "1 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
return 0;
}
输出
1 success. Fail 0 eof 0 bad 0 2 success. Fail 0 eof 1 bad 0 3 Fail 1 eof 1 bad 0
所以第一次写成功了。无懈可击的胜利。但是第一次读取读取了流中的所有内容并到达文件末尾(不是流是文件,而是名称卡住了),设置了 EOF 位。一旦设置了 EOF 位,除了清除该位并祈祷有人添加更多数据以供读取之外,您对流无能为力。
流中添加了更多数据,但由于 EOF 位,文件无法接受它。
如果我们清除EOF
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string h;
stringstream ss;
if (ss << 1)
{
cout << "1 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "2 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
h += '\n';
ss.clear(); // added this
if (ss << 2)
{
cout << "3 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
if (ss >> h)
{
cout << "4 success. Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
h += '\n';
cout << h << "endline";
cout << endl;
}
else
{
cout << "4 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "3 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "2 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
}
else
{
cout << "1 Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
return 0;
}
现在输出
1 success. Fail 0 eof 0 bad 0 2 success. Fail 0 eof 1 bad 0 3 success. Fail 0 eof 0 bad 0 4 success. Fail 0 eof 1 bad 0 2 endline
如果我们忽略我添加的所有状态信息,我们真的得到了
2 endline
不是想要的
1 2 endline
因为 ss >> h
将覆盖 h
中已有的所有内容。 “1\n”被“2”擦除
获得所需内容的最简单方法是写入所有内容,然后将内容作为 string
。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string h;
stringstream ss;
if (ss << 1 << '\n' << 2 << '\n')
{
cout << ss.str() << "endline";
cout << endl;
}
else
{
cout << "Fail " << ss.fail() << " eof " << ss.eof()
<< " bad " << ss.bad() << endl;
}
return 0;
}
这次的输出是
1 2 endline