标签: stringstream

std :: stringstream从字符串中读取int和字符串

我用C++编程,我不知道如何实现以下功能:

我正在将文件流复制到内存中(因为我被要求,我更喜欢从流中读取),然后尝试访问其值以将它们存储到字符串和int变量中.

这是为了创建一个解释器.我将尝试解释的代码是(即):

10 PRINT A
20 GOTO 10
Run Code Online (Sandbox Code Playgroud)

这只是一个快速示例代码.现在,值将首先存储在"地图"结构中,并在以后将"解释"所有内容时进行访问.要存储的值是:

int lnum //行号

string cmd //命令(PRINT和GOTO)

string exp // expression(在这种情况下为A和10但可以保存像(a*b)-c这样的表达式)

问题给出了以下代码,如何访问这些值并将它们存储在内存中?exp字符串也是可变大小的(可以只是一个变量或一个表达式)所以我不知道如何读取它并将其存储在字符串中.

码:


#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <map>
#include <sstream>

using namespace std;

 #include "main.hh"


int main () 
{
    int lenght;
    char *buffer;

// get file directory
    string dir;
    cout << "Please drag and drop here the file to interpret: ";
    getline (cin,dir);
    cout << "Thank you.\n";
    cout << "Please wait while your file …
Run Code Online (Sandbox Code Playgroud)

c++ string stringstream

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

stringstream和french locale(French_France.1252)

std::stringstream stream_french;
stream_french.imbue(std::locale("")); // French_France.1252
stream_french << 1000;
std::string value_french = stream_french.str();
Run Code Online (Sandbox Code Playgroud)

此代码将1000转换为字符串"1 000",但value_french [1]的值为-96而不是32,为什么会这样?

value_french[0] = 49
value_french[1] = -96 
value_french[2] = 48
value_french[3] = 48 
value_french[3] = 48
Run Code Online (Sandbox Code Playgroud)

如果我做

stream_french << "1 000";
Run Code Online (Sandbox Code Playgroud)

value_french [1]的值是32.该错误似乎与char的signedess有关,但为什么在进行转换时它只影响空格?

c++ locale stringstream internationalization

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

使用字符串或流?

我需要逐步构建一个字符串,并试图找到最好的方法来做到这一点.它可以增长到的最大值是大约10k,因此计划做这样的事情:

const unsigned long long configSize = 10240; //Approximation
void makeMyConfig() {
   std::string resp;
   std::string input;
   resp.reserve(configSize);
   while ( getInput(input) ) {
     resp += input;
   }

   if ( resp.length > configSize ) 
      log << "May need to adjust configSize. Validate" << endl;

   if (!sendConfig(resp)){
      log << "Error sending config" << endl;
   }
}
Run Code Online (Sandbox Code Playgroud)

getInput可以从文件/ tcp conn或ftp读取,并在运行时决定.它接收const char*并将其放入一个字符串(我可以避免,但为方便起见)

但是,我听说有一种非常有效的方法来处理字符串流,但不知道该怎么做.欣赏任何见解.

c++ string stringstream

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

使用 stringstream 将 pid_t 转换为 const char*

我想将进程 pid 转换为 const char* 但下面不起作用:

            std::ostringstream str_pid;
        str_pid << getpid();
        const char * cstr_pid = str_pid.str().c_str();
Run Code Online (Sandbox Code Playgroud)

它在大多数情况下都有效,但有时会产生错误的结果。显然我做错了什么。任何想法?

c++ string pid stringstream

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

使用字符串流解码十六进制编码的字符串

使用字符串流对字符串进行十六进制编码很容易,但是可以反向并使用字符串流解码生成的字符串吗?

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>

int main()
{
  std::string test = "hello, world";

  std::stringstream ss; 
  ss << std::hex << std::setfill('0');
  for (unsigned ch : test)
    ss << std::setw(2) << int(ch);

  std::cout << ss.str() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我不打算直接移位字节或使用旧的c函数,例如scanf系列函数.

c++ encoding hex stringstream

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

复制构造函数错误,没有明显的副本

我试图从头开始构建一些简单的日志记录功能,使用像"<<"接口这样的流,并且遇到了一些编译器问题.以下是我的代码的基础知识:

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

class Logger
{
public:
    class Buffer
    {
    public:
        Buffer(Logger &parent) : mPar(parent)
        {
        }

        ~Buffer(void)
        {
            mPar.endline(os);
        }

        template<class T>
        Buffer& operator<<(const T& x)
        {
            os << x;
            return *this;
        }

        Logger& mPar;
        std::ostringstream os;
    };

    Buffer write(void)
    {
        return Buffer(*this);
    }

    void endline(std::ostringstream& os)
    {
        std::cout << os.str() << std::endl;
    }
};

int main(int argc, char **argv)
{
    Logger log;

    log.write() << "fred" << 3 << "bob";
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

In file included …
Run Code Online (Sandbox Code Playgroud)

c++ iostream stringstream ostringstream

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

将 Stringstream 传递到方法中

我想要做的是创建一个以字符串流作为参数的方法,在方法中写入它,然后从方法外部的字符串流中读取。

例如这样的事情。

void writeToStream(std::stringstream sstr){
   sstr << "Hello World";
}

int main(){
   std::stringstream sstr;
   writeToStream(sstr);
   std::cout << sstr.str();
}
Run Code Online (Sandbox Code Playgroud)

但当我这样做时,我遇到了编译时错误。这可能是因为我应该使用对 stringstream 或类似内容的引用。我尝试过使用引用或指针的不同组合,但似乎没有任何效果?

c++ stringstream

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

C ++比较并替换stringstream的最后一个字符

我想检查以下内容:

  1. 如果追加到的最后一个字符stringstream是逗号。
  2. 如果是,将其删除。

std::stringstream str;
str << "["
//loop which adds several strings separated by commas

str.seekp(-1, str.cur); // this is to remove the last comma before closing bracket

str<< "]";
Run Code Online (Sandbox Code Playgroud)

问题是如果循环中未添加任何内容,则会从字符串中删除左括号。因此,我需要一种方法来检查最后一个字符是否为逗号。我这样做是这样的:

if (str.str().substr(str.str().length() - 1) == ",")
{
    str.seekp(-1, rteStr.cur);
}
Run Code Online (Sandbox Code Playgroud)

但是我对此并不很好。有一个更好的方法吗?

关于循环:

循环用于标记通过套接字接收的一组命令,并将其格式化以通过另一个套接字发送给另一个程序。每个命令以一个OVER标志结尾。

std::regex tok_pat("[^\\[\\\",\\]]+");
std::sregex_token_iterator tok_it(command.begin(), command.end(), tok_pat);
std::sregex_token_iterator tok_end;
std::string baseStr = tok_end == ++tok_it ? "" : std::string(*tok_it);
while (baseStr == "OVER")
{
    //extract command parameters
    str << "extracted_parameters" << "," …
Run Code Online (Sandbox Code Playgroud)

c++ regex stringstream

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

重置 std::stringstream 格式标志

我需要在控制台中打印十六进制和十进制值。我用下面的一段代码来做到这一点。

std::stringstream ss;

ss << "0x" << std::uppercase << std::hex << 15;    
std::cout << ss.str() << std::endl;

ss.str("");
ss.clear();

ss << 15;
std::cout << ss.str() << std::endl;
Run Code Online (Sandbox Code Playgroud)

但我以十六进制格式获取这两个值。如何重置字符串流?

c++ stringstream

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

如何在 C++ 中正确获取输入/输出流的文件/流位置指针?

如果我有一个std::stringstream变量并且我std::string objects在其中写入了一些变量,并且我希望能够跟踪流位置指针并将它们输出到屏幕上,那么我如何使用,tellp() 然后当我从流中提取时,即使用流对于输入,我如何使用tellg(). 如何再次以输入模式打开流?另外,当我再次打开它进行输入时,我应该将位置指针设置回 0seekg()吗?seekp()

这是我的代码

std::string word;
std::stringstream ss;

while (word != "n") {
  std::cout << "Enter a word, ( n to stop) : ";
  std::cin >> word;
  std::cin.ignore();
  if (word == "n")
    ss << std::endl;
  else {
    ss << word;
    ss << " ";
  }
}

std::cout << "The content in stringstream is : " << ss.str() << std::endl;

std::cout << "The StreamPositionPointer is"
          << ss.tellp();  // is …
Run Code Online (Sandbox Code Playgroud)

c++ stringstream

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