c - 如何在 Ubuntu 中“执行”Makefile 以运行从标准输入读取并输出到标准输出/标准错误的 C 程序
问题描述
我正在处理一个家庭作业问题,它从input.txt文件中读取字符并将读入的第一个单词输出到output.txt中,第二个输入到error.txt中,然后将第三个输入到output.txt中,依此类推,直到它到达input.txt文件的末尾。
我应该注意到这一切都是使用 Ubuntu 18.04 完成的
我得到了一个自定义的 Makefile 并且必须编辑一个名为split.c的 C 程序,它将input.txt通过stdin并输出到stdout/stderr。我可以编写我的 C 程序并将其列在下面,但是我无法测试它是否正确,因为我不明白如何运行 make、如何正确设置我的文件以及我的 C 程序是否正确读取和输出应该。
我尝试在终端中运行“make”命令,但收到:
make:没有指定目标,也没有找到 makefile。停止。
我看过无数关于 Linux 的文章,制作“制作文件”等,但我不知道我被问到什么或做什么,所以我停滞不前。非常感谢指导!
自定义 makefile 如下所示,名为Makefile.dat:
CC=gcc
CFLAGS=-Wall
EXEC=split
SRC=$(EXEC).c
TEXT_DIR=test
TEST_INPUT=$(TEST_DIR)/input.txt
OUT=$(TEST_DIR)/stdout.txt
ERR=$(TEST_DIR)/stderr.txt
EXP_OUT=$(TEST_DIR)/output.txt
EXP_ERR=$(TEST_DIR)/error.txt
TEST_REQS=$(TEST_INPUT) $(EXP_OUT) $(EXP_ERR)
DIFF=diff -bBqa
all: $(EXEC)
$(EXEC): $(SRC)
$(CC) $(CFLAGS) $(SRC) -o $(EXEC)
.PHONY: test
test: $(TEST_REQS) $(EXEC)
./$(EXEC) < $(TEST_INPUT) > $(OUT) 2> $(ERR)
$(DIFF) $(EXP_OUT) $(OUT)
$(DIFF) $(EXP_ERR) $(ERR)
echo TEST PASSED!
.PHONY: clean
clean:
$(RM) $(EXEC)
我的 C 程序看起来像这样,被称为split.c:
#include <stdio.h>
int main(){
int input;
// keep getting characters until end-of-file
while((input = fgetc(stdin)) != EOF){
// prints to stdout
printf(stdout, "%d", input);
if(input = " ")
printf("\n"); // encounters whitespace so print new line
// prints to stderr
printf(stderr, "%d", input);
if(input = " ")
printf("\n"); // encounters whitespace so print new line
}
return 0;
}
想法是它接受输入文件,然后它将每个字母打印到其各自的文件中,如果遇到空格,它将在将下一个字符添加到另一个文件之前打印一个新行。
例如:
input.txt有文字:
"How do I do this stuff?"
output.txt将具有:
How
I
this
error.txt将具有:
do
do
stuff?
我完全希望我的 C 程序缺少代码。我在编写程序时的想法是,打印到标准输出,然后如果遇到空白,打印一个新行,然后开始打印到标准错误,并重复直到达到 EOF。
解决方案
要么重命名Makefile.dat
为Makefile
,像这样:
mv Makefile.dat Makefile
make
或make
使用您的-f
选项和参数运行Makefile
:
make -f Makefile.dat
确保您的所有文件 ( split.c
, test/input.txt
, Makefile
) 都存在于与 相同的目录中Makefile
,否则这将不起作用。
请注意您的 C 代码的一些问题:
if(input = " ")
是错的。首先,它将一个带有空格的字符串" "
(它是指向 的指针char
)分配给input
,而不是检查是否input
是空格字符。
要解决此问题,请使用以下命令:
if(input == ' ')
在这两种情况下。
推荐阅读
- node.js - Firebase CLI 如何更改项目范围?firebase init(错误:403,调用者没有权限)使用另一个帐户的项目 url
- r - 在 R 中重新格式化 eval 的输出
- amazon-web-services - 无法通过 SSH EKS 工作节点
- c - 我可以使用函数在 C 中定义数组的长度吗?
- java - 点击时JMenuItem如何接收任务?
- android - 如何在 Android 中单击 ImageView 更改我的 Android 应用程序中的语言
- excel - 如何多次复制两个特定的行和列?
- ionic3 - 使用 Android 权限插件 Ionic 3 Angular 5 时,Object(...) 不是函数
- c# - 如何避免匹配以#开头的数字字符串?
- bash - Bash printf: how to understand zero dot s ("%0.s") syntax