LinuxForum.Fans
Тема

Можно ли через СИ вызвать AWK с дальнейшей обработкой данных в СИ?

Автор: ivan_tiran 6 сообщений 1300 просмотров
14.12.2014 11:29 #405051

Доброго времени суток.
Я знаю, что для этих целей используют flex. Но мне привычней и понятней awk. Есть какой-нибудь способ либо использовать библиотеки awk, либо выполнить вызов самой awk. Нужно написать функцию, которая из входного потока будет брать данные, а на выходе, если этот поток является числом, возвращать строку, иначе NULL или пустая строка.

14.12.2014 12:51 · отредактировано #405065

Можно попробовать выполнить awk через семейство вызовов exec. Но идти этим путем не советую.

"ivan.tiran" написал:
которая из входного потока будет брать данные, а на выходе, если этот поток является числом, возвращать строку, иначе NULL или пустая строка.

А что мешает написать эту функцию на си ?

14.12.2014 13:03 #405068
marikk написал:
Можно попробовать выполнить awk через семейство вызовов exec. Но идти этим путем не советую.

[quote="ivan.tiran"]которая из входного потока будет брать данные, а на выходе, если этот поток является числом, возвращать строку, иначе NULL или пустая строка.

А что мешает написать эту функцию на си ?[/quote]

Слишком много писать, и не факт, что получится без ошибок. Очень много комбинаций будет. Если ещё добавить экспоненциальную форму...

14.12.2014 14:18 #405074
"ivan.tiran" написал:
Нужно написать функцию, которая из входного потока будет брать данные, а на выходе, если этот поток является числом, возвращать строку, иначе NULL или пустая строка.

в простом случае system(3), если нужно контролировать только ввод или вывод, то достаточно popen(3), а если нужно и то и другое, или нужен полный контроль над процессом, то придётся ручками через fork(2) и одну из функций семейства exec(3), для контроля ввода-вывода нужны pipe(2) и dup(2).

15.12.2014 11:26 #405184
ivan.tiran написал:
Доброго времени суток.
Я знаю, что для этих целей используют flex. Но мне привычней и понятней awk. Есть какой-нибудь способ либо использовать библиотеки awk, либо выполнить вызов самой awk. Нужно написать функцию, которая из входного потока будет брать данные, а на выходе, если этот поток является числом, возвращать строку, иначе NULL или пустая строка.

Можно, только это называется "через жопу"
В стандартной библиотеке C функция, которая читает строку из файла, называется fgets(), а а преобразовать её в число с проверкой корректности можно с помощью strtol() или даже sscanf(). Только не советую использовать scanf()/fscsnf() - они с подвохом.

17.12.2014 21:15 #405648

Спасибо всем за информацию. Я понял, что слишком переборщил)))
Не стал рассматривать экспоненциальную форму числа и сделал простенький анализатор, который возвращает строку в случае числа и NULL в случае нечисловых данных.

Войдите или зарегистрируйтесь, чтобы ответить.