我有一个C ++程序,其主要功能的原型如下:
int main(int argc, char * argv[])
我没有编写代码,但这是一个可用的单个C文件here。 当我编译这段代码时,通过命令行运行它:
someexe in.txt > out.txt
这给了我一个输出out.txt,它是通过对in.txt中的一些输入进行操作而在同一目录中生成的。
someexe in.txt out.txt
这给了我命令行本身的输出。 (不使用>
运算符)
但是,我没有使用命令行参数而不使用输出重定向>
运算符,而是尝试从另一个函数调用main函数并自己传递参数。如果我传递char*
{fileDirName,in.txt}的数组,我不知道如何生成out.txt(因为我认为>
输出重定向是一个可用的操作系统级函数在命令行中。)
任何建议都将不胜感激
链接中的程序可以作为复制粘贴使用,可以尝试(主要功能在上面的程序中写入)
答案 0 :(得分:0)
你不能从源内调用另一个main()另一个程序 - main()是特殊的。
如果您想将此源代码重用为库,则需要将main()重命名为其他内容。
但是,如果它以正常的Unix方式处理来自管道或文件(例如myprog < input.txt
或myprog input.txt
)的输入,则透明处理起来有点棘手。
最好的方法是将编译的程序作为一个单独的进程从新程序中调用,传递正确的命令行参数 - 请参阅exec() family调用
答案 1 :(得分:0)
假设目标是模仿shell的输出重定向功能(> out.txt
),您可以执行以下操作:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>
#include <iostream>
int main() {
int fd = open("out.txt", O_WRONLY|O_CREAT|O_TRUNC, 0660);
assert(fd >= 0);
const int ret = dup2(fd, 1);
assert(ret >= 0);
std::cout << "Hello redirected world!" << std::endl;
close(fd);
}
你也可以为stdin做类似的事情,模仿输入重定向(< in.txt
)。这些内容也会在调用exec()
时保留。
当然,如果您有源可用,修改程序以写入您想要的位置会更简单。
请注意dup2()
,即“交换”我们刚打开的stdout fd是不可移植的。 IIRC open()
(与fopen()
相对)也是特定于UNIX的)