2015-06-20 3 views
0

Say есть код C++, который я компилируется в исполняемый файл с помощью:Запуск исполняемых файлов с помощью Haskell

g++ test.cpp -o testcpp 

Я могу запустить это с помощью терминала (я использую OS X), и обеспечивают входной файл для обработки внутри программы на C++, как:

./testcpp < input.txt 

Мне было интересно, если делать это возможно, от в Haskell. Я слышал о функции readProcess в модуле System.Process. Но это только позволяет запускать команды командной оболочки.

Делать это:

out <- readProcess "testcpp" [] "test.in" 

или:

out <- readProcess "testcpp < test.in" [] "" 

или:

out <- readProcess "./testcpp < test.in" [] "" 

выкидывает эту ошибку (или что-то очень похожи в зависимости от того, какой из вышеперечисленных я использую):

testcpp: readProcess: runInteractiveProcess: exec: does not exist (No such file or directory) 

Так что мой вопрос: может ли это сделать из Haskell. Если да, то каким образом и какие модули/функции я должен использовать? Благодарю.

EDIT

Хорошо, так, как предложил Дэвид, я удалил входные аргументы и попытался запустить его. Выполнение этой работы:

out <- readProcess "./testcpp" [] "" 

Но я все еще придерживаюсь ввода данных.

+0

В первой части, вы исполняемым с именем 'test' и во второй части вы пытаетесь для запуска исполняемого файла с именем 'testcpp'. Это верно? Также я думаю, вам нужно прочитать содержимое 'test.in', а затем передать эту строку в качестве последнего аргумента, вместо того, чтобы указывать имя файла. –

+0

@DavidYoung Да, я просто представил общие примеры того, что я пытался сделать. Но, похоже, это путано, я его отредактировал. Что касается второй части вашего комментария, вы не совсем поняли. AFAIK, проблема заключается в запуске самого файла exec, а не с предоставлением входных аргументов. – Roshnal

+0

вы всегда можете создать файл со сценарием оболочки и запустить * it *. –

ответ

4

The documentation for readProcess говорит:

readProcess 
    :: FilePath Filename of the executable (see RawCommand for details) 
    -> [String] any arguments 
    -> String  standard input 
    -> IO String stdout 

Когда она просит standard input это не запрашивает файл для чтения ввода из, но фактическое содержание стандартного ввода для данного файла.

Таким образом, вы должны будете использовать readFile или тому подобное, чтобы получить содержимое test.in:

input <- readFile "test.in" 
out <- readProcess "./testcpp" [] input 
+0

Да! Это сработало. Спасибо за ответ и ясное объяснение :) – Roshnal

Смежные вопросы