Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
std::stringstream从字符串中读取int和字符串 我在C++编程,我不知道如何实现以下内容:_C++_String_Stringstream - Fatal编程技术网

std::stringstream从字符串中读取int和字符串 我在C++编程,我不知道如何实现以下内容:

std::stringstream从字符串中读取int和字符串 我在C++编程,我不知道如何实现以下内容:,c++,string,stringstream,C++,String,Stringstream,我正在将一个文件流复制到内存中(因为我被要求,我更喜欢从流中读取),然后尝试访问它的值以将它们存储到字符串和int变量中 这是为了创建一个解释器。我将尝试解释的代码是(即): 这只是一个简单的示例代码。现在,这些值将首先存储在“映射”结构中,然后在“解释”所有内容时进行访问。 要存储的值包括: int lnum//行号 字符串cmd//命令(打印和转到) string exp//表达式(本例中为A和10,但可以包含(A*b)-c之类的表达式) 下面的代码给出了一个问题,我如何访问这些值并将它们存

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

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

这只是一个简单的示例代码。现在,这些值将首先存储在“映射”结构中,然后在“解释”所有内容时进行访问。 要存储的值包括:

int lnum//行号

字符串cmd//命令(打印和转到)

string exp//表达式(本例中为A和10,但可以包含(A*b)-c之类的表达式)

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

代码:


#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#包括“main.hh”
int main()
{
内部长度;
字符*缓冲区;
//获取文件目录
字符串目录;
cout>cmd>>exp;
程序[lnum]=cmd;//在映射中存储值
//从缓冲区释放内存,超出范围
删除[]缓冲区;
返回0;
}
我希望这是清楚的

谢谢你的帮助

瓦莱里奥这可能会有所帮助:

特别是第7.3节


最好不要显式地使用向量来动态分配缓冲区。 这使得内存管理隐式化

// Create buffer and copy stream to it   
std::vector<char>   buffer(lenght);
p_prog.read (&buffer[0],lenght);
p_prog.close();
//创建缓冲区并将流复制到其中
标准::向量缓冲区(长度);
p_prog.read(和缓冲区[0],长度);
p_prog.close();
就我个人而言,我没有显式地使用close()(除非我想捕获异常)。只要在作用域中打开一个文件,当文件超出作用域时,析构函数就会关闭该文件。

如果您已经知道该类型,则可以使用来提取令牌

对于解释器,我强烈建议使用实际的解析器,而不是编写自己的解析器。Boost的库或工作非常好。您可以在解析语法时使用语义操作构建解释器原语,或者只构建AST

另一个选择是Flex&。基本上,这些都是解析预定义语法的工具。你可以建立自己的,但要为挫折做好准备。递归地平衡圆括号或强制执行操作顺序(例如,先除后乘)并非易事

原始C++解析方法如下:


#include <sstream>
#include <string>

// ... //

istringstream iss(buffer);
int a, b;
string c, d;

iss >> a;
iss >> b;
iss >> c;
iss >> d;


#包括
#包括
// ... //
istringstream iss(缓冲区);
INTA,b;
字符串c,d;
iss>>a;
iss>>b;
iss>>c;
iss>>d;

这样做的方法(尤其是您提到的算术表达式部分)是:

  • 编写一些代码来确定令牌的结束和开始位置。例如,
    5
    +
    将被称为令牌。您可以在文本中扫描这些分隔符,或者使用常用分隔符(如空格)
  • 写出你正在分析的语言的语法。例如,您可以编写:
表达式->值 表达式->表达式+表达式 表达式->表达式*表达式 表达式->函数(表达式) 表达式->(表达式) 然后根据这个语法,您可以编写一些东西,将表达式的标记解析为树

所以你可能会有一棵这样的树(请原谅ASCII艺术)

+ / \ 5 * / \ x3 其中,这表示表达式5+(x*3)。通过将其放在树结构中,在代码中计算表达式非常容易:您可以递归地降低树,以子节点作为参数执行操作

请参阅以下维基百科文章:

  • (您的需求可能非常简单,可以使用此功能)
  • (将语法转换为代码的简单方法)
或者咨询您当地的计算机科学部门。:-)

还有一些工具可以根据语法为您生成这些解析器。您可以搜索“解析器生成器”。

buffer(lenght])
// Create buffer and copy stream to it   
std::vector<char>   buffer(lenght);
p_prog.read (&buffer[0],lenght);
p_prog.close();

#include <sstream>
#include <string>

// ... //

istringstream iss(buffer);
int a, b;
string c, d;

iss >> a;
iss >> b;
iss >> c;
iss >> d;

expression -> value expression -> expression + expression expression -> expression * expression expression -> function ( expression ) expression -> ( expression ) + / \ 5 * / \ x 3