我用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) 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有关,但为什么在进行转换时它只影响空格?
我需要逐步构建一个字符串,并试图找到最好的方法来做到这一点.它可以增长到的最大值是大约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*并将其放入一个字符串(我可以避免,但为方便起见)
但是,我听说有一种非常有效的方法来处理字符串流,但不知道该怎么做.欣赏任何见解.
我想将进程 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)
它在大多数情况下都有效,但有时会产生错误的结果。显然我做错了什么。任何想法?
使用字符串流对字符串进行十六进制编码很容易,但是可以反向并使用字符串流解码生成的字符串吗?
#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系列函数.
我试图从头开始构建一些简单的日志记录功能,使用像"<<"接口这样的流,并且遇到了一些编译器问题.以下是我的代码的基础知识:
#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) 我想要做的是创建一个以字符串流作为参数的方法,在方法中写入它,然后从方法外部的字符串流中读取。
例如这样的事情。
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 或类似内容的引用。我尝试过使用引用或指针的不同组合,但似乎没有任何效果?
我想检查以下内容:
stringstream是逗号。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) 我需要在控制台中打印十六进制和十进制值。我用下面的一段代码来做到这一点。
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)
但我以十六进制格式获取这两个值。如何重置字符串流?
如果我有一个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)