标签: stringstream

tellp 在空 ostringstream 上的标准行为

tellp我对调用空的标准行为有疑问ostringstream。我有一个函数 foo 调用tellp第一件事:

void foo(std::ostream& os)
{
    std::ostream::pos_type pos = os.tellp();
    // do some stuff.
}

int main()
{
    std::ostringstream os;
    foo(os);
}
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio 2005 中,使用新创建的空变量调用此函数会导致ostringstream变量pos设置为 invalid pos_type,而在 Visual Studio 2005 中该变量设置为pos_type(_BADOFF)

ofstream没有相同的行为,其中tellpreturns pos_type(0),这是一个有效的pos_type.

这个行为符合标准吗?此行为与其他编译器一致吗?

c++ standards-compliance stringstream

5
推荐指数
1
解决办法
1398
查看次数

如何阻止读取 C++ stringstream 以等待数据

因此,我一直试图弄清楚如何等待来自 C++ stringstream 的数据(例如),而不需要不断检查数据是否存在,这非常消耗 CPU。

例如,我完全能够从串行设备读取数据,并在没有数据到达时锁定进程,但不幸的是我无法弄清楚如何使用 C++ 流来做到这一点。

我确信我错过了一些东西,因为 cin 正是这样做的,即等待返回键从 istream 读取中退出,但它是如何做到的呢?

预先感谢您对这个主题的任何了解。

c++ stringstream istream istringstream

5
推荐指数
1
解决办法
3610
查看次数

无需内存分配即可将 std::stringstream 转换为 const char**

据我了解, astd::stringstream在内部表示不是作为一个std::string而是作为一组std::string实例。(如果我错了,请纠正我)。

我有表示为 an 的数据std::stringstream,我想将它传递给一个 C 函数(clCreateProgramWithSource来自 OpenCL),该函数期望数据作为字符数组的数组。( const char**).

是否有某种方法可以在首先创建一个包含 stringstream 的全部内容的字符串的情况下执行此操作,例如通过以下方式:

std::string tmp1 = my_stringstream.str();
const char* tmp2 = tmp1.c_str();
const char** tmp3 = &tmp2;
Run Code Online (Sandbox Code Playgroud)

编辑

后续问题:

如果这是没有可能的,是有一些替代方案std::stringstream,继承std::ostream,允许这种低级别的访问权限?

c++ std stringstream opencl

5
推荐指数
1
解决办法
6126
查看次数

C++ getline 和 stringstream

我正在尝试读入一个文件,该文件有 5 行,每行有 3-4 个字符串长。这是我的输入文件:

10:30 Hurley 1234567A 10:15
10:45 Hurley 1234567A 11:30
08:35 Jacob 1x1x1x1x1x
08:35 Jacob 1x1x1x1x1x 08:10
08:05 Jacob 1x1x1x1x1x
08:45 Sayid 33332222 09:15
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

10:30 Hurley 1234567A   10:15
10:45 Hurley 1234567A   11:30
08:35 Jacob  1x1x1x1x1x 11:30
08:35 Jacob  1x1x1x1x1x 08:10
08:05 Jacob  1x1x1x1x1x 08:10
08:45 Sayid  33332222   09:15
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

void enor::Read(status &sx,isle &dx,ifstream &x){
    string str;
    getline(x, str, '\n');
    stringstream ss;
    ss << str;
    ss >> dx.in >> dx.name >> dx.id >> dx.out;
    /*getline(x, str, '\n'); …
Run Code Online (Sandbox Code Playgroud)

c++ stringstream getline

5
推荐指数
1
解决办法
2万
查看次数

如何跟踪 std::stringstream 中的当前位置

我正在编写一个自定义记录器,我将日志消息缓冲在 a 中,std::stringstream并在文件足够大std::ofstream时将其刷新到文件 ( ) 中std::stringstream(以节省一些 IO 延迟)。由于std::stringstream没有.size()方法,我使用seekgtellg

template <typename T>
MyClass & operator<< (const T& val)
{
    boost::unique_lock<boost::mutex> lock(mutexOutput);
    output << val;  //std::stringstream output;
    output.seekg(0, std::ios::end);
    if(output.tellg() > 1048576/*1MB*/){
        flushLog();
    }
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

问题:在我看来,每当我调用此方法时,它都会seekg从头到尾开始计算字节数,并使用tellg. 我想出这个设计首先是为了节省一些 IO 时间,但是:这种连续计数是否会带来更大的成本(如果在大多数情况下调用此方法的次数很高并且日志消息很小) )?

有一个更好的方法吗?

还有一个附带问题:1MB在当今的普通计算机中,缓冲区大小是一个很好的数字吗?

谢谢

c++ stringstream

5
推荐指数
1
解决办法
4694
查看次数

istringstream 十进制整数输入到 8 位类型

这个:

#include <iostream>
#include <sstream>
#include <inttypes.h>

using namespace std;

int main (void) {
    istringstream iss("123 42");
    int8_t x;
    while (iss >> x) {
        cout << x << endl;
    }
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

产生:

1
2
3
4
2
Run Code Online (Sandbox Code Playgroud)

但我想要:

123
42
Run Code Online (Sandbox Code Playgroud)

转换iss >> (int)x(我最初用 a 尝试过char)给了我“错误:二进制表达式的无效操作数('istringstream'(又名'basic_istringstream')和'int')”(clang)或“错误:'operator>>'的模糊重载" (g++)。

有没有办法将值作为数字直接读入8 位类型,还是必须使用中间存储?

c++ stringstream

5
推荐指数
1
解决办法
978
查看次数

std::ws(空格)在读取数据时的作用

保存在我的文件中的数据是(在此测试的开头和结尾都添加了空格):

1 2 3

使用以下带有或不带有“std::ws”的代码加载数据不会造成任何差异。所以我对“std::ws”的作用感到困惑,因为我看到了使用它的代码。有人可以解释一下吗?谢谢!

void main ()
{
ifstream inf; 
inf.open ("test.txt"); 

double x=0, y=0, z=0;
string line;

getline(inf, line);
istringstream iss(line);
//Using "std::ws" here does NOT cause any difference
if (!(iss >> std::ws >> x >> y >> z >> std::ws))
{
    cout << "Format error in the line" << endl;
}
else
{
    cout << x << y << z << endl;
}
iss.str(std::string ());
iss.clear();

cin.get();

}
Run Code Online (Sandbox Code Playgroud)

c++ whitespace stringstream getline istringstream

5
推荐指数
2
解决办法
9264
查看次数

当TStringStream加载二进制非文本文件时,为什么TStringStream.DataString的使用失败?

  1. 正如专家已经建议好心,TStringStream.DataString不能用于检索non-text由加载的数据TStringStream.LoadFromFile,因为TStringStream.GetDataString会叫TEncoding的编码方法,其中,采取TMBCSEncoding例如,将调用TMBCSEncoding.GetChars这反过来又来电TMBCSEncoding.UnicodeFromLocaleChars,最后WindowsMultiByteToWideChar.

  2. 建议将TBytes用作数据缓冲区/二进制存储.(为此,建议使用TBytes而不是AnsiString.)

  3. bytes可以从被检索TStringStream.ReadBuffer的方法或TStringStream.Bytes属性.无论哪种方式,TStream.Size都应该考虑.

================================================== ==

我正在尝试使用TStringStream它并DataString用于base64编码/解码目的.似乎有可能如此此处Nils Haeck的回复所示.

  1. 使用TStringStream.DataStringTMainForm.QuestionOfString_StringStream(第2号至7号)失败,该信息已损坏(即不一样的原始信息).但是,ss_loaded_2.SaveToFile(No.1)保存原始信息,表示TStringStream是否在内部正确保存解码的非文本数据?你能帮忙评论一下DataString损坏的可能原因吗?

  2. Rob Kennedy他的答复中,他提到stringansistring应该避免存储base64解码的非文本数据,这很有意义.然而,如图中TMainForm.QuestionOfString_NativeXML,所述DecStringAnsiString类型包含所以正确的数据可以被编码回经解码的字节.这是否意味着AnsiString可以保存已解码的非文本数据?

  3. David Heffernan并且Rob Kennedy好好评论了字节/ TBytes.然而,bytes提取的TMainForm.QuestionOfString_NativeXML_Bytes_1,从不同TStringStream的 …

delphi string hex stringstream delphi-xe

4
推荐指数
1
解决办法
5132
查看次数

如何将字符串中的数字列表复制到C++向量

我有一个字符串:

string line="6,148,72,35,0,33.6,0.627,50,1";
Run Code Online (Sandbox Code Playgroud)

我想将其中的数字复制到std :: vector的各个元素中.我想使用std :: vector.assign()或std :: copy().

所以我写道:

string line="6,148,72,35,0,33.6,0.627,50,1";
vector<double> row;
istringstream iss { line };
row.assign(istream_iterator<double>(iss), istream_iterator<double>());
Run Code Online (Sandbox Code Playgroud)

但结果是assign()只将字符串中的第一个数字复制到向量,即得到

row={6}
Run Code Online (Sandbox Code Playgroud)

虽然我想得到

row={6,148,72,35,0,33.6,0.627,50,1}
Run Code Online (Sandbox Code Playgroud)

如果我使用std :: copy,就像在:

string line="6,148,72,35,0,33.6,0.627,50,1";
vector<double> row;
istringstream iss { line };
copy(istream_iterator<double>(iss), istream_iterator<double>(), back_inserter(row));
Run Code Online (Sandbox Code Playgroud)

看完第一个数字后,看起来字符串的副本结束,我不知道为什么.知道如何使用assign()或copy()将字符串中的每个数字复制到向量中吗?

c++ stl vector stringstream c++11

4
推荐指数
1
解决办法
297
查看次数

Stringstream C++ while 循环

程序在逗号之间找到整数,如“2,33,5”-> 2 33 5。问题是如果我把例如“0,12,4”这样的字符串,它为什么工作。stringstream 不应该将 0 放入 tmp 中,所以循环就像开始时的 while(0) 一样吗?

 vector<int> parseInts(string str) {
 stringstream ss(str);   //getting string 
 vector<int> result;
 char ch;
 int tmp;
 while(ss >> tmp) {      //while(IS IT INTEGER ALREADY OR NOT?)
     result.push_back(tmp);
     ss >> ch;           
}
return result;
Run Code Online (Sandbox Code Playgroud)

c++ loops stringstream zero

4
推荐指数
1
解决办法
6233
查看次数