используя exec для сортировки текстового файла в c - PullRequest
1 голос
/ 11 декабря 2011

У меня есть текстовый файл, полный записей (output.txt), и я хочу отсортировать каждую запись по ее идентификатору.После сортировки отсортированные записи записываются в новый файл (sorted.txt).

Для этого я использую команду bash "sort" через функцию execl ().Чтобы проверить правильность моей команды сортировки, я написал ту же команду прямо в bash, и результат был ожидаемым.Но когда я пытаюсь использовать команду execl через мою C-программу, в большинстве случаев ответом будет то, что нет файла / usr / bin / sort (я использую Mac OSX), или сообщение об ошибке не будет выдано, но тем не менееничего не происходит ... То, что я использую, это:

execl("/usr/bin/sort", "usr/bin/sort", "-n","-k", "1", "-u", "output.txt", ">", "sorted.txt", (char*)NULL);

или это

execl("/usr/bin/sort", "usr/bin/sort", "-n","-k", "1", "-u", "-o", "sorted.txt", "output.txt", (char*)NULL);

Я знаю, что обе эти 2 команды сортировки верны, когда я использую их вБаш.Что происходит с C?Спасибо всем заранее!

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Перенаправление вывода (> somefile.txt) является функцией оболочки, а не программой сортировки (которая AFAIK не является встроенной в bash). Семейство функций exec не запускает оболочку, только указанная вами программа.

Если вы не знаете путь к программе, вы можете использовать функции с p в их именах (я думаю, execlp в вашем случае) и просто дать им "sort" в качестве имени программы, они я буду искать его в $ PATH, как это делает bash.

1 голос
/ 13 декабря 2011

В качестве альтернативы вы можете попробовать system("sort output.txt > sorted.txt").Поведение функции system зависит от реализации, хотя в Linux она в основном порождает новую оболочку, которая выполняет переданную ей команду.system(ARG) эквивалентно sh -c ARG.Перенаправление будет работать, если оболочка поддерживает это в реализации вашей системы функции system.

...