需要从文本文件中读取操作并在程序中执行

时间:2014-01-26 11:42:46

标签: c++ c

我在接受采访时被问到一个问题,想知道解决问题的方案方法。

Que:我们有一个文本文件,其中包含需要在程序中执行的操作。用户可以更新此文本文件并更改操作,即文本文件可以包含+用于添加或 - 用于减法。程序有两个变量即a和b,读取文本文件,执行操作和显示结果。如果文本文件包含+,则程序应返回a和b的总和,如果文本文件有 - 则程序应返回a-b。用户可以将任何操作放在文本文件中。

我给出了两种方法:

  1. 程序中可以包含switch语句。如果文本文件有+,程序检查switch语句并按照switch语句执行+ b操作,就像其他操作一样明智。这个答案被拒绝,因为我们必须在交换机中硬编码所有可能的操作。

  2. 我可以使用oracle并对任何操作运行查询,即如果文本文件有+,那么我可以创建一个sql字符串,如'select a + b into:result from dual;'并在程序中运行嵌入式sql。数据库将执行sql并返回任何有效操作的输出,程序不需要硬编码所有可能的操作。当我接受C ++ / C和pro * c的采访时,我给出了这个答案。但小组对此方法也不满意。

  3. 那么通过程序解决这个问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

可能是这样的,具有类似原型的函数的查找表

int add(int a,int b)
{
    return a+b;
}

int sub(int a,int b)
{
    return a-b;
}

typedef int (*function_cb)(int,int);
std::map<string, function_cb> callBacks;

.....
void init_lookup()
{
    callBacks["+"] = &add;
    callBacks["-"] = &sub;
}

然后根据您的文本文件使用它

 int res = callBacks["-"](8,4);

-84来自您的文字文件

答案 1 :(得分:0)

要从输入文件中读取表达式,您可以使用标准库提供的标准读取方法:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("example.txt");
  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << '\n';
    }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;
}

(代码取自cplusplus.com

关于翻译从文件中获得的字符串...你会深入到表达式树中。要使用表达式树,您可以查看下面的代码。这是我过去写的一个解释这个概念的人:

class Token
{
public:
  enum TokenTypes { operator_token, operand_token };

  Token();
  Token( std::string token );
  ~Token(); // we are not inheriting, so no need to be virtual
  Token(const Token &in);
  Token& operator=(const Token &in);
  TokenTypes getId() const;

  // you need to set the left/right from addToken(), see class Tree
  void setLeft(Token* left);
  void setRight(Token* right);   
  const Token* getLeft();
  const Token* getRight();

private:

  // when creating the Token you need to be able to identify
  // what TokenType the string is
  TokenTypes tokenId( std::string token );

  TokenTypes m_id; // type of token
  std::string m_token; // the actual string token e.g. "+", "12", ..
  Token* m_left; // the pointers to the children left or right in a binary tree
  Token* m_right; 

};

class Tree
{
public:
  Tree();
  ~Tree(); // clean up 
  void addToken( std::string token ); // this adds a token to the tree
private:
  Token* m_root; 
};

然后你可以像这样使用它......

std::string strToken
Tree T; 
while ( getNextStringToken(strToken) )
{
  Token* newToken = new Token(strToken);
  T.addToken(newToken);
}

您可以在Wikipedia上了解有关此概念的更多信息。

我希望这可以帮到你!

答案 2 :(得分:0)

在我看来,他们只想读取字符+, - ,*并将此字符放在变量之间并执行语句。

有关如何将字符串转换为表达式的信息,请参阅此答案Convert string to mathematical evaluation

答案 3 :(得分:-1)

我认为这些问题更像是运算符重载,你可以定义当操作数是函数/非标准变量时正常运算符会做什么。