Как я могу передать строку из файла в качестве аргумента в программу переменного тока через bash? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть программа c, которая принимает в качестве аргумента строку. Строка ввода в качестве аргумента представляет собой одну строку файла, поэтому, например, один из моих файлов содержит следующее:

0410000340000230
1111111111111111
1800400700032050

До сих пор я написал скрипт bash для автоматизации работы:

#!/bin/bash
read -p "make clean"
make clean
read -p "make"
make

file=$1
while read line; do
echo $line
done < $file

Пока все хорошо. Сейчас я хочу использовать вывод команды echo $ line в качестве аргумента моей программы. Я пробовал:

echo $line | ./program
echo $line > ./program
echo $line < ./program
./program < echo $line

Иногда мне просто сообщают об ошибке, что для моей программы нет аргументов, а в других случаях возникает ошибка сегментации.

Может кто-нибудь сказать мне, что я делаю не так?

Код C основной программы:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "functions.h"

int main(int argc, char * argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./Sudoku <Sudoku en une seule ligne. Represantation des cases vides avec 0>\n");
        return 0;
    }
    FILE *f, *g;
    int n, n_clauses, ** Sudoku;
    n = (int) sqrt((double) strlen(argv[1]));
    if (ceil(sqrt((double) strlen(argv[1]))) == sqrt((double) strlen(argv[1])))
    {
        Sudoku = (int **)malloc(n * sizeof(int *));
        for (int i = 0; i < n; i++)
        {
            Sudoku[i] = (int *)malloc(n * sizeof(int));
        }
        remplir_sudoku(argv[1], n, Sudoku);
    }
    else
    {
        n = (int) sqrt((double) find_sudoku_length(argv[1]));
        printf("\n %d\n", n);
        Sudoku = (int **)malloc(n * sizeof(int *));
        for (int i = 0; i < n; i++)
        {
            Sudoku[i] = (int *)malloc(n * sizeof(int));
        }
        remplir_sudoku_v2(argv[1], n, Sudoku);
    }
    afficher_sudoku(Sudoku, n);

    n_clauses = nb_clauses(n);
    n_clauses = n_clauses + nb_remplis(Sudoku, n);
    f = fopen("CNF", "w");
    fprintf(f, "c CNF\n");
    fprintf(f, "p cnf %d %d\n", n*n*n, n_clauses);
    transformer_en_cnf(f, Sudoku, n);
    fclose(f);
    return 0;
}

1 Ответ

3 голосов
/ 06 мая 2019

Ошибка произошла из-за входного файла, содержащего литералы возврата каретки, без написания программы на языке C для обработки случая.

«Неоднозначное перенаправление» было вызвано передачей имени файла с пробелами без правильных кавычек. Всегда указывайте свои расширения: <"$file", а не <$file.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...