标签: stringstream

使用字符串流?

假设我在C++中有一个stringsteam,我想对它做不同的操作,如:

搜索一系列字符,将文本块转换为int(在行的中间),来回移动get指针等等.

使用stringstreams做这类事情的标准/常用方法是什么?

c++ string stringstream

3
推荐指数
1
解决办法
605
查看次数

std :: stringstream作为参数

我对C++语言有些新意.我正在编写一个用于记录到文件的实用程序类.它工作得很漂亮,但现在我想通过使它更方便使用来增强它(例如将字符串流传递给日志功能).

这是我一直在尝试的,但它没有奏效.

定义:

void LogStream( std::stringstream i_Log ){ m_FileHandle << i_Log << std::endl; }

呼叫:

m_LogObject->LogStream( "MKLBSearchEngine::Search( " << x << ", " << i_Filter << " ) - No Results Found" );

c++ parameters logging stringstream

3
推荐指数
1
解决办法
7960
查看次数

stringstream输出的原因是什么?

我正在尝试学习stringstream,我有以下代码:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    stringstream os;
    os.str("Purohit");
    os << "Vipul" << endl;
    cout << os.str() << endl;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并运行它时,我得到以下输出:

Vipul
t
Run Code Online (Sandbox Code Playgroud)

为什么?不应该输出Purohit Vipul?

c++ stringstream

3
推荐指数
1
解决办法
96
查看次数

stringstream::str 复制生命周期

很多 C++ 程序员在第一次使用stringstreams 时会错过(读:我)这样一个事实,即返回的副本stringstream::str()是临时的,它会持续到它所使用的表达式结束为止。但是,我不明白:

  1. 这是如何完成的。查看sstreamlibstdc++ 的标头,我只看到正在制作并返回一个副本。寿命是如何限制的?
  2. 为什么这是理想的行为,特别是因为这是一个如此常见的问题。如果无论如何都会制作副本,为什么我不能拥有它的所有权?

请注意,这不是stringstream、string 和 char* 转换混淆的重复。这超出了对行为和解决方法的解释;我正在寻找机制和原理。

c++ memory stringstream

3
推荐指数
1
解决办法
1385
查看次数

Writing a struct into a stringstream in C++

I have some structs as:

struct dHeader
{
    uint8_t    blockID;
    uint32_t   blockLen;
    uint32_t   bodyNum;
};
struct dBody
{
    char       namestr[10];
    uint8_t    blk_version;
    uint32_t   reserved1;
}
Run Code Online (Sandbox Code Playgroud)

and I have a stringstream as:

std::stringstream Buffer(std::iostream::in | std::iostream::out);
Run Code Online (Sandbox Code Playgroud)

I want to write a dHdr and multiple dBody structs into Buffer with

Buffer << Hdr1;
Buffer << Body1;
Buffer << Body1;
Run Code Online (Sandbox Code Playgroud)

I get the error:

error: no match for 'operator<<' in 'Buffer << Hdr1'

If I try it with:

Buffer.write(reinterpret_cast<char*>(&Hdr1), sizeof(dbHdr1));
Buffer.write(reinterpret_cast<char*>(&Body1), sizeof(Body1));
Buffer.write(reinterpret_cast<char*>(&Body2), …
Run Code Online (Sandbox Code Playgroud)

c++ stringstream

3
推荐指数
1
解决办法
4408
查看次数

从字符串中读取数字列表

我想读一个存储在字符串中的空格分隔数字列表.
我知道如何stringstream在C++中使用 - :

string s = "10 22 45 67 89";
stringstream ss(s);
int numbers[100];
int k=0, next_number;
while(ss>>next_number)
    numbers[k++]=next_number;
Run Code Online (Sandbox Code Playgroud)

我的问题是我们怎样才能在C中做到这一点?我已经sscanf()在C中读过,但我不确定它在这里是否有用.

c scanf stringstream string-parsing

3
推荐指数
2
解决办法
3203
查看次数

std :: stringstream operator >>无法将字符串转换为float

我无法理解为什么第二个>>失败.我做错了什么或遗漏了一些代码?

std::ifstream file;
std::stringstream ss;
std::string str;
float f1, f2;

file.open("file.txt");
getline(file, str);
ss.str(str);
ss >> f1;

getline(file, str);//when packed inside if(), evalueates to true
ss.str(str);
ss >> f2; //when packed inside if(), evalueates to false - but why it fails?


std::cout<<"str = "<<str<<"\n";
std::cout<<"ss.str() = "<<ss.str()<<"\n";
std::cout<<"f1 = "<<f1<<"\nf2 = "<<f2<<"\n";
Run Code Online (Sandbox Code Playgroud)

文件:

0.120000
0.120000
Run Code Online (Sandbox Code Playgroud)

输出:

str = 0.120000
ss.str() = 0.120000
f1 = 0.12
f2 = 2.06831e+032
Run Code Online (Sandbox Code Playgroud)

我已经在多个文件上尝试了这个代码,显然只有第一次插入到float中,文件末尾有一个空行

编辑

正如Dan指出的那样,我尝试直接从文件中提取浮点数:

file.open("file.txt");
file >> f1;
file >> f2;
Run Code Online (Sandbox Code Playgroud)

理想的工作; 也简化了很多代码

c++ stringstream

3
推荐指数
1
解决办法
583
查看次数

std::stringstream::flush() 应该做什么?

std::ostream有一个flush()方法:

将未提交的更改写入基础输出序列。

这对 a 意味着什么std::stringstream?如果我理解正确,这意味着对于这样的流没有什么可做的。这是真的?

c++ stringstream streambuf c++-standard-library

3
推荐指数
1
解决办法
161
查看次数

创建包含字符串和 std::endl 的变量,可在 std::cout 的输出流中使用

使用c++17

我有一个头文件colors.hpp来帮助我将彩色输出到标准输出:

#pragma once
#include <string>

namespace Color
{
    static const std::string yellow = "\u001b[33m";
    static const std::string green = "\u001b[32m";
    static const std::string red = "\u001b[31m";
    static const std::string end = "\u001b[0m";
}
Run Code Online (Sandbox Code Playgroud)

我经常这样使用它:

std::cout << Color::green << "some green text " << Color::end << std::endl;
Run Code Online (Sandbox Code Playgroud)

我几乎总是紧随std::endl其后Color::end。我希望能够实现相同的结果(换行+缓冲区刷新),但仅使用一个变量 - 例如Color::endl.

我只能提出解决方案string,据我所知,这些解决方案将包含该\n字符,但也不会强制刷新到标准输出。

static const std::string endl = std::ostringstream(static_cast<std::ostringstream &&>(std::ostringstream() << Color::end << std::endl)).str();
Run Code Online (Sandbox Code Playgroud)

如果我从上面的代码中删除.str(),那么我就不能这样做: std::cout << …

c++ cout stringstream ostringstream c++17

3
推荐指数
1
解决办法
102
查看次数

stringstream 运算符&gt;&gt; 无法在调试中分配数字

我有一个简单的函数,给定一个字符串str,如果它是一个数字,则返回“true”并覆盖参考输入num

template <typename T>
bool toNumber(string str, T& num)
{
    bool bRet = false;
    if(str.length() > 0U)
    {
        if (str == "0")
        {
            num = static_cast<T>(0);
            bRet = true;
        }
        else
        {
            std::stringstream ss;
            ss << str;
            ss >> num;    // if str is not a number op>> it will assign 0 to num
            if (num == static_cast<T>(0)) 
            {
                bRet = false;
            }
            else
            {
                bRet = true;
            }
        }
    }
    else
    {
        bRet = false; …
Run Code Online (Sandbox Code Playgroud)

c++ iostream stringstream istream visual-c++

3
推荐指数
1
解决办法
86
查看次数