2

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

感谢您的帮助。

4

2 回答 2

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)。

于 2012-11-11T23:20:50.593 回答
1

告诉 Xcode 您希望为已编译的命令行程序重定向标准输入、输出或错误似乎很困难,如果不是不可能的话。Program > Scheme > Edit Scheme 菜单仅对应用程序“Arguments Passes On Launch”[Cmd+<] 有所帮助,这与 shell 中的重定向运算符 < 和 > 不同。似乎与终端和 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
于 2020-12-03T10:10:36.610 回答