使用C重定向程序输出,使用fprintf还是“更广泛使用”的解决方案?

问题描述

Noob Q,与最佳做法有关:

我正在使用yacc / lex / C为macOS编写MS BASIC解释器。它对scanfprintf使用PRINT / INPUT。我想添加一个CLI选项以将那些重定向文件

我知道如何使用fopen / fclose和fprintf等技术地做到这一点。但是,这是“真正的” Unixen程序如何做到的呢?我希望尽可能地保持标准,以免在其他人检查代码时造成混乱。

在通用Unix / Linux / FBSD上,您会...

  1. 将所有printf替换为fprintf(fp,,并将fp替换为标准输出
  2. 保留所有printf,但重定向stdout吗?
  3. 仅依靠外壳和管道,根本不提供此选项作为CLI选项吗?

解决方法

(对于一般程序)

仅依靠父级(如shell)的正常重定向并没有错,但是如果您想为此提供一个参数(这也很好)。

至于使用printffprintf,我看不出有什么不同。我可能会根据典型情况选择一个或另一个。如果几乎总是在stdout上输出,则可能会使用printf和fprintf。可能造成混淆的部分是,其他人在阅读您的代码时可能不会意识到printf不是程序标准输出(对于重定向,您可以使用freopen或-在使用stdio- { {1}}。

(对于您的BASIC解释器)

在这种情况下,当您翻译dup2(,1);INPUT时,PRINTscanf似乎是合理的选择,但我不确定为什么您需要选择将它们更改为其他内容。