Направление вывода из команды на ввод файла C - PullRequest
0 голосов
/ 26 апреля 2020

Итак, у меня есть текстовый файл, который я использую, который содержит несколько цветовых кодов. Я хочу использовать команду grep для регулярных выражений, а затем передать ее по конвейеру, чтобы отсортировать по их альфа-значению и вывести результат в новый файл. Но в середине я хочу использовать свою собственную программу C, которая объединяет альфа-значения с кодами, у которых их еще нет, и которые я затем хочу отсортировать. Команды и программа C были протестированы отдельно и работают нормально, моя проблема заключается в том, чтобы передать вывод grep во входной файл моего C, а затем отсортировать его и вывести в новый файл. Я делаю все это внутри make-файла, и в настоящее время он компилируется, но ничего не печатает в новый выходной файл.

Команда:

build-test: test.c
  gcc test.c -o test

run-test: build-test
  grep -iE '^#[a-f0-9]{6}([a-f0-9]{2})?$$' colours.txt | ./test | sort --stable -rk1.8 > rgba-colours.txt

C Программа:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{
    int lines = 1;
    char line[1000], alpha[] = "ff";

    extern FILE *stdin;

    stdin = fopen("colours.txt", "r");

    while (fgets(line, 1000, stdin) != NULL)
    {
        line[strlen(line) - 1] = 0;
        lines += 1;

        if (strlen(line) == 7)
        {
            strcat(line, alpha);
        }
    }

    fclose(stdin);
    return 0;
 }

Colours.txt

#b293a6
#a69d36a2
#067806
#7f0bf7ef
#f8b366
#042847421
#8946d7
#c927d4
#3e568bff
#3e1ce1
#11570a00
#e02a67
#afe6e
#1a283af
#44999e
#b07c2292
#0e6da9
#31511bxf
#25680a10
#866156
#dd85

1 Ответ

0 голосов
/ 26 апреля 2020

Ваш Makefile должен выглядеть следующим образом:

run-test: build-test
    grep -iE '^#[a-f0-9]{6}([a-f0-9]{2})?$$' colours.txt | ./test | sort --stable -rk1.8 > rgba-colours.txt

build-test: test.c
    gcc -Wall -Wextra -pedantic test.c -o test

clean:
    rm -f test rgba-colours.txt

Я также добавил цель clean, которую могут ожидать пользователи, которая удалит все выходные артефакты. -f используется для того, чтобы rm, и, следовательно, само make clean не работало при отсутствии файлов.

Ваш test.c не читает stdin и ничего не печатает на стандартный вывод. Используйте stdin в fgets, добавьте puts(line); после обработки каждой строки, пока l oop, и используйте правильный main прототип, подобный этому:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int lines = 1;
    char line[1000], alpha[] = "ff";

    while (fgets(line, 1000, stdin) != NULL)
    {
        line[strlen(line) - 1] = 0;
        lines += 1;

        if (strlen(line) == 7)
        {
            strcat(line, alpha);
        }

        puts(line);
    }

    fclose(stdin);
    return 0;
 }
...