Читайте и проверяйте системный вызов построчно внутри функции - PullRequest
2 голосов
/ 23 апреля 2019

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

Я искал в сетикакие-либо советы или идеи о том, как это сделать, но я не могу найти ни одного.Следует отметить, что я не хочу, чтобы вывод записывался в файл, а затем читался из этого файла, а скорее читал вывод из командной строки построчно.

int main(int argc, char const *argv[]) {
    system("ls -al");
    return 0;
}

Например, вПриведенный выше код, я хочу напечатать все файлы в текущем каталоге с помощью этой функции C.Имея эту информацию, я хочу напечатать только те, которые были обновлены в апреле (отмечены «апрелем» в 6-м столбце).Могу ли я прочитать вывод построчно, разбить строку на массив и проверить, является ли указанный столбец «апрелем», и если да, то как?Любая помощь и совет будут высоко оценены.

1 Ответ

4 голосов
/ 23 апреля 2019

Вы можете использовать popen, например так:

#include <stdio.h>

int main()
{
    FILE * fp = popen("ls -l", "r");
    char buf[1024];
    while (fgets(buf, 1024, fp)) {
        printf("returned: \"%s\"\n", buf);
    }
    return 0;
}

Это показывает только чтение каждой строки из команды, вам все равно придется разделить текст, чтобы сделать то, что вы хотите.

И только потому, что это забавно, здесь есть простая функция для извлечения полей из строкового буфера:

char * get_field(char *buffer, int field)
{
    int white = 1; // simple state machine
    char *p;
    char *first = NULL;
    for (p=buffer; *p; p++) {
        if (white) {
            if (*p > ' ') {
                white = 0;
                first = p;
            }
        } else {
            if (*p <= ' ') {
                white = 1;
                field--;
                if (!field && first)
                    return strndup(first, p-first);
            }
        }
    }
    return NULL;
}

int main()
{
    FILE * fp = popen("ls -l", "r");
    char buf[1024];

    while (fgets(buf, 1024, fp)) {
        char *month = get_field(buf, 6);
        if (month) {
            printf("  month: \"%s\"\n", month);
            free(month);
        }
        char *file = get_field(buf, 9);
        if (file) {
            printf("  file: \"%s\"\n", file);
            free(file);
        }
    }
    return 0;
}

Это простой метод грубой силы, подходящий для простых программ, и не обеспечивающийфункциональность типичной функции split ().Но это иллюстрирует один из способов сделать это в C.

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