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

时间:2018-01-31 17:19:44

标签: c file file-handling

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您想要查看名为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()中。

答案 2 :(得分:0)

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

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

C11标准含糊地在system函数的第7.22.4.8节中说。

在某些实现中,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,然后使用/tmp/temporaryplugin.sosystem与命令(在运行时构建的字符串中)(例如gcc -Wall -O -fPIC -shared /tmp/temporaryc.c -o /tmp/temporaryplugin.so)编译成临时文件到一些临时plugin input(f"Enter data for row {row}: ") ,并且最后dynamically load该插件使用dlopen(3)

还要查看JIT-compilationlibgccjit库。

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