首页 > 解决方案 > 如何在 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。

标签: cmakefilestdoutstdinstderr

解决方案


要么重命名Makefile.datMakefile,像这样:

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 == ' ')

在这两种情况下。


推荐阅读