考虑这个程序:
#include <iostream>
#include <string>
#include <sstream>
#include <cassert>
int main()
{
std::istringstream stream( "-1" );
unsigned short n = 0;
stream >> n;
assert( stream.fail() && n == 0 );
std::cout << "can't convert -1 to unsigned short" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在OS X 10.5.6上的gcc(版本4.0.1 Apple Inc. build 5490)上试过这个,断言是真的; 它无法将-1转换为unsigned short.
但是,在Visual Studio 2005(和2008)中,断言失败,结果n的值与编译器生成的隐式转换的结果相同 - 即"-1"为65535," - 2"为65534等但随后在"-32769"变得奇怪,转换为32767.
谁是对的,谁在这里错了?(而且-32769到底发生了什么?)
我正在将数据从流读取到给定长度的char数组中,并且我想使读取的最大宽度足够大以适合该char数组.
我使用char数组的原因是我的规范的一部分是任何单个标记的长度不能超过某个值,所以我节省了一些构造函数调用.
我认为width()做了我想要的,但我显然错了......
编辑:我正在使用流提取操作符来执行提取,因为这些是平面文本文件,其值由空格分隔.
我是C++的新手(来自C#背景),我正在尝试学习如何将字符串转换为int.
我通过使用a stringstream并将其输出到a中来实现它double,如下所示:
const char* inputIndex = "5+2";
double number = 0;
stringstream ss(inputIndex);
ss >> number;
// number = 5
Run Code Online (Sandbox Code Playgroud)
这非常有效.时遇到的问题是,字符串我解析开始与一个数字,而是可以具有其他的,而不是数字(例如,"5 + 2","9-(3 + 2)",等等)之后的数字字符.在stringstream开头解析数字,当它遇到一个非数字,就像我需要它停止.
当我想知道用于解析数字的字符数时,就会出现问题.例如,如果我解析25+2,我想知道两个字符用于解析25,以便我可以提前字符串指针.
到目前为止,我通过清除stringstream,将解析后的数字输入其中并读取结果字符串的长度来实现它:
ss.str("");
ss << number;
inputIndex += ss.str().length();
Run Code Online (Sandbox Code Playgroud)
虽然这确实有效,但对我来说这似乎真的很糟糕(虽然这可能只是因为我来自C#之类的东西),而且我有一种感觉可能导致内存泄漏,因为它str()创建了一个字符串的副本.
有没有其他方法可以做到这一点,还是我应该坚持我拥有的东西?
谢谢.
我有一些vector<char>我想写的数据std::stringstream.
我试过了:
my_ss.write(vector.data(), vector.size());
Run Code Online (Sandbox Code Playgroud)
......但它似乎没有说明my_ss我声明如下:
std::stringstream my_ss( std::stringstream::binary);
为什么写不起作用(应用程序不崩溃并编译0错误,0警告)?
我想知道什么是最好的方法,从一个写std::stringstream成vector<int>.
以下是以下内容的示例stringstream:
"31 #00 532 53 803 33 534 23 37"
这是我得到的:
int buffer = 0;
vector<int> analogueReadings;
stringstream output;
while(output >> buffer)
analogueReadings.push_back(buffer);
Run Code Online (Sandbox Code Playgroud)
然而,似乎发生了什么,它首先读取,然后它到达#00并返回,0因为它不是一个数字.
理想情况下,我想要的是,它到达a #然后只是跳过所有字符直到下一个空格.这可能是旗帜或其他什么?
谢谢.
可能重复:
在C++中将字符串打印到临时流对象
std :: ostringstream打印c-string的地址而不是其内容
我正在尝试使用stringstream构建一个字符串,就像你使用cout一样.这适用于类似日志记录的类.我遇到的问题是,如果<<运算符的第一个参数是一个字符串,当我随后使用stringstream :: str()调用打印出该字符串流时,我得到一个垃圾地址,而不是字符串.这只发生在FIRST字符串中.后续字符串很好.数字总是好的.这是代码:
// class I use to print out the stream
class StreamWriter
{
public:
StreamWriter()
{}
~StreamWriter()
{
std::string myMessage = m_stringstream.str();
std::cout << myMessage << std::endl;
}
std::stringstream m_stringstream;
};
// macro for simplification
#define OSRDEBUG (StreamWriter().m_stringstream)
// actual use
OSRDEBUG << "Hello " << "my " << "name is Pris " << 123456;
// output
0x8054480my name is Pris 123456
0x8054480my name is Pris 123456
0x8054480my name is Pris 123456
0x8054480my …Run Code Online (Sandbox Code Playgroud) 正如专家已经建议好心,TStringStream.DataString不能用于检索non-text由加载的数据TStringStream.LoadFromFile,因为TStringStream.GetDataString会叫TEncoding的编码方法,其中,采取TMBCSEncoding例如,将调用TMBCSEncoding.GetChars这反过来又来电TMBCSEncoding.UnicodeFromLocaleChars,最后Windows的MultiByteToWideChar.
建议将TBytes用作数据缓冲区/二进制存储.(为此,建议使用TBytes而不是AnsiString.)
在bytes可以从被检索TStringStream.ReadBuffer的方法或TStringStream.Bytes属性.无论哪种方式,TStream.Size都应该考虑.
================================================== ==
我正在尝试使用TStringStream它并DataString用于base64编码/解码目的.似乎有可能如此处或此处Nils Haeck的回复所示.
使用TStringStream.DataString中TMainForm.QuestionOfString_StringStream(第2号至7号)失败,该信息已损坏(即不一样的原始信息).但是,ss_loaded_2.SaveToFile(No.1)保存原始信息,表示TStringStream是否在内部正确保存解码的非文本数据?你能帮忙评论一下DataString损坏的可能原因吗?
在Rob Kennedy他的答复中,他提到string或ansistring应该避免存储base64解码的非文本数据,这很有意义.然而,如图中TMainForm.QuestionOfString_NativeXML,所述DecString的AnsiString类型包含所以正确的数据可以被编码回经解码的字节.这是否意味着AnsiString可以保存已解码的非文本数据?
David Heffernan并且Rob Kennedy好好评论了字节/ TBytes.然而,bytes提取的TMainForm.QuestionOfString_NativeXML_Bytes_1,从不同TStringStream的 …
以下代码在GCC,Clang和Visual Studio中失败:
#include <string>
#include <sstream>
int main() {
std::string s = "hello"; // ok, copy-initialization
std::stringstream ss1(s); // ok, direct-initialization
std::stringstream ss2 = s; // error
}
Run Code Online (Sandbox Code Playgroud)
我认为直接初始化的唯一情况是复制初始化不起作用的时候构造函数是显式的,在这种情况下不是这样.这是怎么回事?
有人可以解释微妙的区别:
ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.rdbuf();
f.good() // filestream is bad!!
ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.str();
f.good() // is still ok!
Run Code Online (Sandbox Code Playgroud)
我主要使用.rdbuf()将字符串流推送到文件中(因为它更有效),但是如果字符串流为空而不是文件流变坏...?这不是傻瓜吗?我想我不太明白<< s.rdbuf()......
基本上我正在制作Exception类,我希望能够轻松传递调试细节,例如:
var error = someFunction();
if(error!=0) {
throw MyException("someFunction ended with error state #",error,'.');
}
Run Code Online (Sandbox Code Playgroud)
这将要求MyException类接受可以处理的varargs参数stringstream.我不知道我究竟能做到这一点,我想象的是:
#include <string>
#include <sstream>
template /* MUCH DEEP MAGIC HERE**/
MyException::MyException(/* MOAR DEEP MAGIC!!! **/) {
std::stringstream ss;
for(/** ITERATE THROUGH MORE MAGIC**/) {
ss<</**FETCH MAGIC STUFF**/;
}
this->message = ss.str();
}
Run Code Online (Sandbox Code Playgroud)