2012-05-04 34 views
-1

我有一个C++程序,它具有的主要功能的原型如下:手动得到输出,而不是输出重定向在CMD线

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

代码尚未由我写的,但这是一个单一的C文件可用here。 当我编译该代码,并通过命令行运行它为:

someexe in.txt > out.txt
这使我这是在相同的目录中通过对从in.txt一些输入操作产生的输出out.txt。

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

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

任何建议,将不胜感激

在链接的程序是容易获得的复制粘贴,并可以尝试(主要功能是在最后在上面编写的程序)

+0

这真的和C++没有关系。好吧,不多。这是我们正在讨论的Bash终端吗?(如果你在一个Linux发行版上,它可能是) – leftaroundabout

+0

@leftaroundabout:而不是命令行方式,我正在程序本身中执行此操作。所以,我想是的。 – user1372448

+0

再次调用main()是*禁止*。一个简单的方法是检查是否指定了第二个参数并将其用于输出。 –

回答

0

假设其目的是模仿输出重定向功能的exec() family> 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); 
} 

你可以做类似的标准输入也模仿输入重定向(< in.txt)。这些将在exec()的呼叫中保留。

当然,修改程序写入你想要的地方是比较简单的,因为你有源代码可用。

注意,虽然dup2(),“交换”我们刚刚打开的标准输出fd是不可移植的。 IIRC open()(而不是fopen())也是UNIX专用的)

0

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

如果你想重用这个源代码作为库,你需要重命名为main()。

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

最好的方法是调用编译程序从你的新程序中一个单独的进程,传递正确的命令行参数 - 见来电