假设我在C++中有一个stringsteam,我想对它做不同的操作,如:
搜索一系列字符,将文本块转换为int(在行的中间),来回移动get指针等等.
使用stringstreams做这类事情的标准/常用方法是什么?
我对C++语言有些新意.我正在编写一个用于记录到文件的实用程序类.它工作得很漂亮,但现在我想通过使它更方便使用来增强它(例如将字符串流传递给日志功能).
这是我一直在尝试的,但它没有奏效.
定义:
void LogStream( std::stringstream i_Log ){
m_FileHandle << i_Log << std::endl;
}
呼叫:
m_LogObject->LogStream( "MKLBSearchEngine::Search( " << x << ", " << i_Filter << " ) - No Results Found" );
我正在尝试学习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++ 程序员在第一次使用stringstreams 时会错过(读:我)这样一个事实,即返回的副本stringstream::str()是临时的,它会持续到它所使用的表达式结束为止。但是,我不明白:
sstreamlibstdc++ 的标头,我只看到正在制作并返回一个副本。寿命是如何限制的?请注意,这不是stringstream、string 和 char* 转换混淆的重复。这超出了对行为和解决方法的解释;我正在寻找机制和原理。
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) 我想读一个存储在字符串中的空格分隔数字列表.
我知道如何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中读过,但我不确定它在这里是否有用.
我无法理解为什么第二个>>失败.我做错了什么或遗漏了一些代码?
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)
理想的工作; 也简化了很多代码
std::ostream有一个flush()方法:
将未提交的更改写入基础输出序列。
这对 a 意味着什么std::stringstream?如果我理解正确,这意味着对于这样的流没有什么可做的。这是真的?
使用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 << …
我有一个简单的函数,给定一个字符串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) stringstream ×10
c++ ×9
c ×1
c++17 ×1
cout ×1
iostream ×1
istream ×1
logging ×1
memory ×1
parameters ×1
scanf ×1
streambuf ×1
string ×1
visual-c++ ×1