【问题标题】:How to create a program in C that compiles and runs another c program and saves the output in a txt file? [closed]如何在 C 中创建一个程序来编译和运行另一个 c 程序并将输出保存在 txt 文件中? [关闭]
【发布时间】:2018-01-31 17:19:43
【问题描述】:

我想在 C 中创建一个程序,以便它编译另一个 c 程序并将输出保存在文本文件中。例如,我希望使用 C 程序将“input.c”文件的输出存储在名为“output.txt”的文本文件中。请帮忙。

我之所以选择这个项目,是因为在 Turbo C++ 中复制整个输出屏幕通常会变得很困难,而且有时 turbo c 不会显示整个输出,而只复制当前输出屏幕,而留下之前的输出。

【问题讨论】:

  • 是 C 还是 C++ ?迂腐地,你不能在可移植 C 或可移植 C++ 中这样做(因为你不能保证运行你的程序的计算机有一些编译器)。
  • “output.txt 中的输出”是指编译器在编译过程中产生的诊断信息,还是编译后的程序本身在运行时产生的输出信息? (无论哪种方式,听起来都像是从命令行运行并使用 > 运算符将 stdout 重定向到文件会得到你想要的,而无需编程)
  • 请停止标签垃圾邮件 C != C++ != C#。 使用实际适用于您的问题的标签,并停止随机添加看起来相似的其他标签。
  • 我从控制台编译 (MSVC),使用批处理文件确保设置了环境变量。如果 errorlevel 不是 0,它会使用 @NMAKE > TEMP.ERR 重定向的编译器输出重新编译,原因如下:所以我可以更轻松地检查输出。
  • 您不需要 C 程序来编译和运行另一个程序并保存其输出。如果您可以在 C 程序中执行此操作,您可以从命令行 shell 执行此操作(在一些奇怪的仅 GUI 的系统中除外)。所以实际上你只需要知道使用 C 编译器编译的命令,以及运行程序并将其输出重定向到文件的命令。

标签: c file file-handling


【解决方案1】:

这是可能的。您可以运行一个 shell 命令来编译和运行您的子程序(man 3 system,简单),或者您使用更高级的技术,例如动态编译(http://blog.coldflake.com/posts/On-the-fly-C++/https://bellard.org/tcc/,如果您是 C 程序员)

【讨论】:

    【解决方案2】:

    您想查看名为 system() 和 POSIX popen() 的标准 C 函数。

    在带有 C 编译器的 POSIXly 系统上,编译一个简单的 C 程序将是

    system("cc -o input input.c");
    

    然后运行它并捕获输出,

    FILE *fp_in = popen("./input", "r"); /* to read */
    FILE *fp_out = fopen("output.txt", "w"); /* to write */
    

    然后从fp_in 读取并写入fp_out。这是基本的想法。我把细节留给你去弄清楚,这样你就可以深入了解 C 的深层秘密 :-) 不要忘记所有库函数的错误处理。

    PS:如果系统的 shell 支持重定向,你甚至可以将 popen/fopen 组合简化为单个 system("./input > output.txt");

    PPS:如果 PS 有效,您不妨将所有内容合并到 system("cc -o input input.c && ./input > output.txt"); 我相信您知道如何将其包装在 main() 中。

    【讨论】:

    • AFAIK,popen 不在 C11 标准中(但仅在 POSIX 中)
    【解决方案3】:

    C11 标准(阅读 n1570没有定义如何运行编译器。在许多情况下(考虑对某些Arduino 目标进行交叉编译),您将无法在目标机器上运行编译器(它可能“太小”)。

    顺便说一句,您可以将代码编译成某个可执行文件,从系统中删除所有编译器,然后运行该可执行文件(在您的系统没有任何编译器的情况下)......

    C11 标准在 §7.22.4.8 中模糊地提到了 system 函数。

    在某些实现中,system 函数能够通过一些未指定命令处理器启动其他程序(在进程中)。但不能保证您将能够启动一个编译器(例如,您可以在没有任何编译器的 Windows 计算机上运行您的可执行文件)。

    (实际上,您的计算机可能实际上有一些命令行 C 编译器,但您需要知道哪个以及如何调用它)

    On POSIX,您可以使用system(3)(使用/bin/sh -c),也可以使用fork(2) & execve(2) - 和其他功能,例如popen(3)- 启动其他程序。

    在 Linux 上,您通常有一些 命令行 编译器,通常是 GCCgcc(甚至是 cc)。你可以运行它(例如使用system)。

    我喜欢在我的 Linux 系统上做以下技巧:生成一些包含 C 代码的 临时 文件,例如/tmp/temporaryc.c,然后使用systemgcc -Wall -O -fPIC -shared /tmp/temporaryc.c -o /tmp/temporaryplugin.so 之类的命令(在运行时构建的字符串中)将该临时文件编译成一些临时文件plugin /tmp/temporaryplugin.so,最后dynamically load 使用@987654331 的插件@。

    还可以查看 JIT-compilation 库,例如 libgccjit

    顺便说一句,您应该考虑放弃 Turbo C(它是用于 C 或 C++ 过时变体的过时编译器)并在您的 PC 上切换到 Linux。

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2022-07-09
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      相关资源
      最近更新 更多