在 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);
}
我正在开始使用 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);
}