我一直在使用stringstream转换Integer到String,但后来我意识到同样的操作是可以做到的ostringstream.
当我使用.str()它们之间有什么区别?此外,是否有更有效的方法将整数转换为字符串?
示例代码:
//using ostringstream
ostringstream s1;
int i=100;
s1<<i;
string str_i=s1.str();
cout<<str_i<<endl;
//using stringstream
stringstream s2;
int i2=100;
s2<<i2;
string str_i2=s2.str();
cout<<str_i2<<endl;
Run Code Online (Sandbox Code Playgroud) string whatTime(int seconds) {
string h,m,s,ans;
stringstream ss;
ss << (seconds/3600);
seconds -= (3600*(seconds/3600));
ss >> h;
ss.str("");
ss << (seconds/60);
seconds -= (60*(seconds/60));
ss >> m;
ss.str("");
ss << seconds;
ss >> s;
return (h + ":" + m + ":" + s );
}
Run Code Online (Sandbox Code Playgroud)
以上程序的输出以这种格式"some_value ::"我也尝试过ss.str(std :: string())和ss.str().clear(),但即使这样也行不通.有人可以建议如何解决这个问题吗?
这似乎是一个愚蠢的问题,但我很难过.这是我的代码:
int main()
{
string line, command;
getline(cin, line);
stringstream lineStream(line);
bool active;
lineStream >>active;
cout <<active<<endl;
}
Run Code Online (Sandbox Code Playgroud)
无论我输入什么活动,它总是打印出来0.所以我要说我的输入是
true
Run Code Online (Sandbox Code Playgroud)
它输出0和false同样的东西.
我在这个项目中没有UNICODE.这是一个WinAPI项目,变量"input"是一个字符串流,默认值为"0".为什么第一个id语句运行而不是第二个,即使字符串本身为"0"?
void calc::AddToInput(int number)
{
MessageBox(NULL, input.str().c_str(), "Input", NULL); //Shows "0"
if(input.str().c_str() != "0") //Runs even though it shouldn't
{
input << number;
}
else if(input.str().c_str() == "0") //Doesn't run though it should
{
input.str("");
input << number;
}
}
Run Code Online (Sandbox Code Playgroud) 当我尝试从字符串中解析空白分隔的double值时,我发现了这种奇怪的行为,即以循环方式读出字符串.
这是程序:
stringstream ss;
string s("1 2 3 4");
double t;
list<double> lis;
for(int j=0; j!=10; ++j){
ss << s;
ss >> t;
lis.push_back(t);
}
for(auto e : lis){
cout << e << " ";
}
Run Code Online (Sandbox Code Playgroud)
这里输出:
1 2 3 41 2 3 41 2 3 41
Run Code Online (Sandbox Code Playgroud)
如果我追加尾随空间,s= "1 2 3 4 ";我得到
1 2 3 4 1 2 3 4 1 2
Run Code Online (Sandbox Code Playgroud)
现在问题:
1)如果我不知道字符串s中有多少条目,我如何读入列表中的所有条目?
2)operator<<我实际上是在打电话ss << s;?是否指定循环阅读?
3)我可以更好地解析吗?
谢谢!
这是固定代码(感谢timrau):
// …Run Code Online (Sandbox Code Playgroud) 我想将字符串中的十六进制表示转换为unsigned char变量,如下所示:
std::stringstream ss;
uint8_t x;
ss << "1f";
ss >> std::hex >> x; // result: x = 0x31 (=49 in decimal and ='1' as char)
Run Code Online (Sandbox Code Playgroud)
显然,我假设转换会导致x = 0x1f(十进制= 31),因为0x1f小于0xff,这是可以存储在8位无符号字符中的最大值.相反的是,在转换中只使用了我的字符串的前8位.
有人可以向我解释为什么会发生这种情况以及如何解决这个问题?
我正在使用std::stringstream从std::string值中解析一些数据.
这段代码:
std::string str = "data1 data2 data3 \"quotated data\"";
std::stringstream ss(str);
Run Code Online (Sandbox Code Playgroud)
如果我使用,ss >> anotherStr;我会用空格分隔每个单词.
我不明白是否有一个选项可以让stringstream将引号中的数据作为单个字符串值读取?
通常,要处理超出C++中long long范围的整数,您必须将它们表示为字符串并以这种方式对它们执行操作.但是,我在互联网上发现这个代码似乎像魔术一样.它计算两个幂的总和(没有2 ^ 0),即使它不能存储在很长的长度中.
#include <iostream>
#include <cmath>
#include <iomanip>
#include <sstream>
using namespace std;
int main() {
int n;
stringstream ss;
cin >> n;
ss << fixed << setprecision(0) << pow(2, n + 1) - 2;
if (n >= 54) {
string a = ss.str();
a[a.size() - 1] = ((a[a.size() - 1] - 48) - 2) + 48;
cout << a;
return 0;
}
cout << ss.str();
}
Run Code Online (Sandbox Code Playgroud)
它是如何工作的?它适用于涉及大量的任何操作吗?如果n的值非常大(我试过1024)它只打印"inf".可以这种方式计算的数字范围的上限是多少?
以下部分到底做了什么以及它为什么这样做?
a[a.size() - 1] = ((a[a.size() - 1] - 48) …Run Code Online (Sandbox Code Playgroud) 为了从std :: basic_stringstream读/写二进制数据需要什么(某些方法重写?)?我正在尝试以下代码,但是它没有按我预期的那样工作:
std::basic_stringstream<uint64_t> s;
uint64_t a = 9;
s << a;
uint64_t b;
s >> b;
std::cout << b << std::endl;
Run Code Online (Sandbox Code Playgroud)
但我得到“ 0”的字样(使用GCC构建)。
istrstream非常适合我的需求 - 基本上,采用固定的char缓冲区,并给我一个简单的方法来提取行getline()和测试eof()
我正在将我们的项目转换为C++ 17合规性 - 这已被弃用istrsteam- 显然是因为有太多的C++程序员无法理解固定的缓冲内存管理(你认真吗?!)
无论如何,它istringstream提供了相同的使用语义,但它强制需要在构造时复制整个固定字符缓冲区.
这是一种反模式.
我正在寻找的是一种方法来string_view代替一个string用于istringstream替代,或者替代一个更好的替代,stringstream它本身处理外部管理的固定缓冲区(它只需指向它,它永远不需要担心管理该资源,只是一样strstream).
目前,在VS 2017中,这是非法的,如果我理解正确的话,在当前最先进的C++中是非法的(如果我错的话,我相信你会纠正我的!)
std::string_view raw_view(reinterpret_cast<const char *>(raw_buffer.get()), raw_buffer.size());
std::istringstream raw_stream(raw_view);
Run Code Online (Sandbox Code Playgroud)
那么 - 想法?
注意:Peter Sommerlad在这里为C++标准组织提出了这个确切的想法:http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0448r1.pdf
c++ ×10
stringstream ×10
string ×3
binary ×1
c++17 ×1
hex ×1
largenumber ×1
string-view ×1
winapi ×1