在 C++ 中将函数 A 的标准输出作为函数 B 的参数传递

Passing the standard output of function A as the argument of function B in C++

我正在开始使用 C++,我想编写一个链接器

我首先做了一个 tokenizer executable 它将一个文件作为输入并在标准输出中打印其标记列表

%./tokenizer input_file
Token 1 : 3
Token 2 : X
token 3 : 10
etc
...

然后,我编写了一个链接器 executable,它将令牌文件作为输入,并在标准输出中打印符号 table 和内存映射。

%./tokenizer input_file > temp
%./linker temp
Symbol Table :
X=10
etc
...

Memory Map :
000: 1002
etc
...

现在,我的目标是让一个 executable 接收输入文件“INPUT”并在标准输出中打印符号 table 和内存映射。尊重这种格式对我来说很重要。

我要:

%./linker input_file
Symbol Table :
X=10
etc
...

Memory Map :
000: 1002
etc
...

目前,我已经将分词器的 main() 复制到链接器的 .cc 中(当然使用不同的名称),但我不知道下一步该做什么。

例如,我希望我的代码基本上看起来像:(我精确的是 ifstream,因为那是我编写代码的方式,所以它会帮助我保持这种状态)

int getTokens(char* file[]) {
   string token;
   ifstream _file (file);
   doStuff(_file);
   ....
   cout << token << endl;
   ....
}
int main(int argc, char argv*[]) {
   char* input_file[] = argv[1];
   ifstream tokenFile = convertCoutToIFSTREAM(getTokens(input_file))
   doOtherStuff(tokenFile);
   ...
   cout << linkResults << endl; 

我可以制作一个 shell 脚本,我首先 运行 标记器,将其输出保存在一个文件中,然后 运行 链接器,但我想找到一个我不必在两者之间创建文件的方式。

非常感谢您的帮助

一种简单的方法是使用流

你必须改变

void getTokens(char* file[]) {
   string token;
   ifstream _file (file);
   doStuff(_file);
   // ....
   cout << token << endl;
   // ....
}

进入

void getTokens(std::istream& in, std::ostream& out) {
   doStuff(in);
   // ....
   out << token << endl;
   // ....
}

然后你就可以链式调用了。 (不是真正的 pipe,因为整个函数必须在另一个函数开始之前完成)。

void tokenizer(std::istream& in, std::ostream& out);
void linker(std::istream& in, std::ostream& out);

int main(int argc, char* argv[])
{
    assert(argc > 1);
    std::ifstream in(argv[1]);
    std::stringstream ss;
    tokenizer(in, ss);
    linker(ss, std::cout);
}

Demo