如何重定向cout和cin?

时间:2013-01-02 20:09:22

标签: c++ cout cin

我正在使用以下命令执行我的程序: ./myProgram -i test.in -o test.out

这两个文件都合法且存在。

// run all over the arguments and set the cin and cout if needed
for (int i = 1; i < argc; i= i+2)
{
    int j = i+1;

    // loop over each pairs of arguments
    do
    {
        // set cin
        if(argv[i] == "-i")
        {
            static std :: ifstream s_inF(argv[j]);
            std :: cin.rdbuf(s_inF.rdbuf());
            break;
        }

        //set cout
        if(argv[i] == "-o")
        {
            std::ofstream out(argv[j]);
            std::cout.rdbuf(out.rdbuf());
            break;
        }

        // in order to search for the other case
        // (example:X.out -i)
        int temp = i;
        i = j;
        j = temp;
    }while(i>j);
}

我在main中写了这个块,以便根据cin重定向coutchar **argvcin工作正常但cout没有。 当我这样做时它起作用:

// run all over the arguments and set the cin and cout if needed
for (int i = 1; i < argc; i= i+2)
{
    int j = i+1;

    // loop over each pairs of arguments
    do
    {
        // set cin
        if(argv[i] == "-i")
        {
            static std :: ifstream s_inF(argv[j]);
          std :: cin.rdbuf(s_inF.rdbuf());
          break;
        }

        //set cout
        if(argv[i] == "-o")
            break;

        // in order to search for the other case
        // (example:X.out -i)
        int temp = i;
        i = j;
        j = temp;
    }while(i>j);
}

std::ofstream out(argv[4]);
std::cout.rdbuf(out.rdbuf());

导致问题的原因是什么?

2 个答案:

答案 0 :(得分:3)

安装流缓冲区后,您安装到std::cout的流缓冲区的流会被破坏:

std::ofstream out(argv[j]);
std::cout.rdbuf(out.rdbuf());

第一行需要阅读

static std::ofstream out(argv[j]);

可能还有其他错误,但这是我发现的错误。

答案 1 :(得分:0)

它不起作用,因为你需要j为i+1来重定向输出才能工作。试一试 - 如果您首先通过第一个样本中的-o然后-i会发生什么?

改变这个:

        int temp = i;
        i = j;
        j = temp;

对此:

        int temp = i;
        i = j;
        j = temp + 1;

你还必须处理while条件。

那么为什么你需要j呢?您只能使用i而不是使用i + 1进行重定向。我相信这也会使代码更容易理解。