-1

我有一个 C++ 程序,它的主函数原型如下:

int main(int argc, char * argv[])

代码不是我写的,但这是一个可用的 C 文件here。当我编译这段代码,并通过命令行运行它:

someexe in.txt > out.txt
这给了我一个输出 out.txt,它是通过对 in.txt 中的一些输入进行操作而在同一目录中生成的。

someexe in.txt out.txt
这给了我命令行本身的输出。(不使用>运算符)

但是,>我没有传递命令行参数并且不使用输出重定向运算符,而是尝试从另一个函数调用主函数并自己传递参数。如果我传递 {fileDirName, in.txt} 的数组char*,我不确定如何生成 out.txt(因为我认为>输出重定向是命令行中可用的操作系统级函数)。

任何建议将不胜感激

链接中的程序是现成的复制粘贴,可以试一试(main函数写在上面程序的最后)

4

2 回答 2

0

您不能从另一个程序的源内部调用另一个 main() - main() 是特殊的。

如果您想将此源代码作为库重用,则需要将 main() 重命名为其他名称。

但是,如果它以正常的 Unix 方式处理来自管道或文件(例如myprog < input.txtor myprog input.txt)的输入,那么透明地处理就有点棘手了。

最好的方法是将编译后的程序作为一个单独的进程从新程序中调用,并传递正确的命令行参数 - 请参阅exec()调用系列

于 2012-05-04T20:27:11.030 回答
0

假设目标是模仿> out.txtshell 的输出重定向功能 (),您可以执行以下操作:

#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(),我们刚刚打开的那个“交换”标准输出 fd 是不可移植的。IIRC open()(相对于fopen())也是 UNIX 特定的)

于 2012-05-04T20:35:58.193 回答