在cmd行中手动获取输出而不是输出重定向

时间:2012-05-04 20:16:42

标签: c++

我有一个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(因为我认为>输出重定向是一个可用的操作系统级函数在命令行中。)

任何建议都将不胜感激

链接中的程序可以作为复制粘贴使用,可以尝试(主要功能在上面的程序中写入)

2 个答案:

答案 0 :(得分:0)

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

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

但是,如果它以正常的Unix方式处理来自管道或文件(例如myprog < input.txtmyprog 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的)