【问题标题】:give a scanf input string for a c code execution with makefile为使用 makefile 执行 c 代码提供 scanf 输入字符串
【发布时间】:2021-05-02 19:14:53
【问题描述】:

我正在尝试编写我的第一个 makefile 来完全自动化我的代码执行。我有一个必须执行多次的 c 代码(BootstrapCL.c);对于每次执行,我应该输入(我在 c 代码中有 2 个 scanf)一个文件名(带和不带扩展名)。我必须对文件夹内的所有文件(比如一组 cvs 文件)重复此操作。

这是我的makefile

SRCS := $(wildcard *.csv)
BINS := $(SRCS:%.csv=%)

all: ${BINS}

%: BootstrapCL.c
    gcc -Wall BootstrapCL.c  -lm -o BootstrapCL
    ./BootstrapCL 
    $@.csv 
    $@

问题是当makefile到达该行时: ./BootstrapCL shell 等待输入,因此我无法到达下一行以通过 makefile 本身提供此输入。如何解决这个问题并获得自动化流程?

【问题讨论】:

  • makefiles 通常用于构建软件。我建议使用 shell 脚本来查找 csv 文件并将文件名传递给您的可执行文件。
  • 一种正常的技术是让您的BootstrapCL 程序接受多个文件名参数,并依次处理每个文件名(在main() 中使用argv,而不是使用@ 读取987654326@),然后使用./BootstrapCL *.csv处理目录下的所有文件名。如果没有参数,它可能会从标准输入读取文件名,或者它可能会读取数据的标准输入(想想catgrep),或者它可能会反对“我需要给定一个或多个文件名在命令行上”。各有千秋;我可能会选择“将标准输入作为数据处理”或“投诉”。
  • 在考虑从 0 重新启动完全不同的选项(例如 Bash 脚本)之前,我想尝试解决此问题;我并不是说 bash 脚本不是一个好选择,但如果我能解决我发布的问题,我将实现我的目的
  • 处理命令行参数将使程序更普遍有用。哦,第二次执行之后让人们输入标准输入很烦人。您已经从 makefile 中获得了有关如何执行此操作的答案,但这是对 makefile 的滥用。
  • 你明白了乔纳森·莱弗勒的意思;您的解决方案也很有效。有什么想法可以防止makefile作为最后一个目标“全部”执行吗?我不确定,但我认为这是由于我错误地使用了 $@

标签: c shell input makefile scanf


【解决方案1】:

将输入传递给程序。

%: BootstrapCL.c
    gcc -Wall BootstrapCL.c  -lm -o BootstrapCL
    (echo $@.csv ; echo $@) | ./BootstrapCL 

【讨论】:

  • 谢谢@Barmar;最后一个问题:makefile 也执行,最后,目标“all”;当然我没有任何文件“all.csv”,我认为问题来自使用 $@,我该如何防止这种情况?
  • 也许用%:代替$(BINS):
猜你喜欢
  • 1970-01-01
  • 2011-06-28
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多