Я работаю над домашним заданием, которое считывает символы из файла input.txt и выводит первое прочитанное слово в output.txt, второе — в error.txt, затем третий снова в output.txt и так далее, пока не будет достигнут конец файла input.txt.
Должен отметить, что все это делается с помощью Ubuntu 18.04
Мне дали пользовательский Makefile, и мне пришлось отредактировать программу на языке C под названием split.c, которая пропускала input.txt через stdin и выводила в stdout/stderr. Я могу написать свою программу на C, и она будет указана ниже, однако я не могу проверить ее правильность, потому что я не понимаю, как запускать make, как правильно настраивать файлы и правильно ли моя программа на C читает и выводит данные. должен.
Я попытался запустить команду make в терминале, но получаю:
make: Не указаны цели и make-файл не найден. Стоп.
Я просмотрел бесчисленное количество статей о Linux, создании «создать файлы» и т. д., но я не знаю, о чем меня спрашивают или что делать, поэтому я стою на месте. Руководство очень ценится!
Пользовательский make-файл выглядит следующим образом и называется 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.
make
мог его найти. - person thisisbenmanley   schedule 11.08.2019make -f Makefile.data
, затемmake -f Makefile.dat test
. Или скопируйте/переименуйтеMakefile.dat
просто вMakefile
(илиmakefile
), а затем запуститеmake
иmake test
(илиmake all test
). Есть много способов добиться нужного результата. - person Jonathan Leffler   schedule 11.08.2019make -f makefile.dat test
- person Clifford   schedule 11.08.2019split
является зависимостью от целиtest
, разве недостаточно сделать только цельtest
? - person Clifford   schedule 11.08.2019make
автоматически нашла его. - person thisisbenmanley   schedule 11.08.2019make test
с соответствующим присутствующимmakefile
. - person Jonathan Leffler   schedule 11.08.2019make
, я получаюmake: *** No rule to make target 'split.c', needed by 'split'. Stop
. Когда я запускаюmake -f makefile.dat test
, я получаюmake: Makefile.dat: No such file or directory
. И когда я запускаюmake test
, я получаюmake: *** No rule to make target 'text/input.txt', needed by 'test'. Stop.
Есть идеи, что это значит? - person Obsidian   schedule 11.08.2019