如何在Mac上使用Xcode在C中设置I / O重定向?

时间:2012-11-11 23:13:00

标签: c macos io

我正在编写程序,我需要设置程序以从文本文件中获取输入并将输出保存在文本文件中。我正在使用Xcode而且我在Mac上。我知道我需要在控制台中输入一些重定向命令,但我不确定如何做到这一点。例如,文本文件可以随意使用input.txt和output.txt。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在终端(命令行)上,您可以

command < input.txt > output.txt

cat input.txt | command > output.txt

编辑:

Ok, thanks a lot. Just curious, when I type that in the terminal, 
how does it know to go to Xcode?

在终端上运行命令与Xcode之间的唯一联系是您在Xcode中构建程序。这产生了一个可由Xcode或shell(终端)运行的可执行文件。在终端上运行程序对Xcode完全没有影响。

可能有一种方法可以在Xcode中重定向I / O(也许这就是你最初想要的),但我不知道它(不要使用Xcode)。

答案 1 :(得分:0)

要告诉Xcode您希望重定向已编译的命令行程序的标准输入,输出或错误似乎很困难。 “程序”>“方案”>“编辑方案”菜单仅对应用程序“启动时传递参数” [Cmd + <]有帮助,这与Shell中的重定向操作符<和>不同。似乎没有与Terminal和Xcode的连接,这也说明您无法调试从此类外部Shell启动的程序。

作为没有依赖项的基本解决方法,几个站点建议您将这种重定向烘焙到程序的代码中。对于Apple macOS,甚至可以有条件地做到这一点,例如:

#ifdef __APPLE__
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    freopen("error.txt", "w", stderr);
#endif

一个更详细的示例将利用“环境变量”,该变量可以在非常相同的“产品方案”标签上设置,并且具有如下程序代码:

#include <stdlib.h>

#ifdef __APPLE__
        if (getenv("STDIN")) {
            if (!freopen(getenv("STDIN"), "r", stdin)) {
                NSLog(@"Unable to redirect stdin to '%s'\n", getenv("STDIN"));
            }
        } else {
            NSLog(@"Unknown environment variable STDIN so assuming stdin\n");
        }
        if (getenv("STDOUT")) {
            if (!freopen(getenv("STDOUT"), "w", stdout)) {
                NSLog(@"Unable to redirect stdout to '%s'\n", getenv("STDOUT"));
            }
        } else {
            NSLog(@"Unknown environment variable STDOUT so assuming stdout\n");
        }
#endif