代码之家  ›  专栏  ›  技术社区  ›  Omkar Deshpande

如何在C中创建一个程序来编译和运行另一个C程序,并将输出保存在txt文件中?[已关闭]

  •  -2
  • Omkar Deshpande  · 技术社区  · 8 年前

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

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

    3 回复  |  直到 8 年前
        1
  •  1
  •   yoones    8 年前

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

        2
  •  1
  •   Jens    8 年前

    您想看看名为 system() 和POSIX popen() .

    在带有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() .

        3
  •  0
  •   Basile Starynkevitch    8 年前

    C11标准(阅读 n1570 ) 不定义 如何运行编译器。在许多情况下(考虑交叉编译 Arduino 目标)您将无法在目标计算机上运行编译器(可能“太小”)。

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

    C11标准在a的§7.22.4.8中含糊其辞 system 作用

    在某些实现中 系统 功能能够启动 另外 通过一些 未指定 命令处理器。但不能保证你能开始 编译器 (例如,您可以在没有任何编译器的Windows计算机上运行可执行文件)。

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

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

    在Linux上,通常有 命令行 编译器,通常 GCC gcc (甚至 cc ). 您可以运行它(例如,使用 系统 ).

    我喜欢在Linux系统上执行以下技巧:生成一些 短暂的 包含C代码的文件,例如。 /tmp/temporaryc.c ,然后将该临时文件编译为 plugin /tmp/temporaryplugin.so 通过使用 系统 命令(在运行时生成的字符串中)如下 gcc -Wall -O -fPIC -shared /tmp/temporaryc.c -o /tmp/temporaryplugin.so ,最后 dynamically load 该插件使用 dlopen(3) .

    同时查看 JIT-compilation 库,如 libgccjit .

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