fscanf соответствует одной строке, но не другой, похожей строке - PullRequest
0 голосов
/ 16 сентября 2011

Я пытаюсь прочитать файл (в частности / proc / stat), чтобы извлечь из него данные. Существует множество способов сделать это в C, но (пока) я использую fscanf(). (Однако я не особо привязан к этому - просто кажется, что он хорошо подходит для того, что я хочу сделать. Если есть другой, лучший способ - предложите это). Проблема, которую я вижу, состоит в том, что fscanf() будет читать одну строку (с определенной строкой формата), но отказывается собирать какие-либо данные, если я изменю строку формата на другую строку. Примеры делают это намного яснее.

#include <stdio.h>
char *
get_cpu_perc() {
    unsigned long long cpu0_user=0;
    FILE* file = fopen("/proc/stat", "r");
    int fsf_ret;
    fsf_ret = fscanf(file, "cpu %llu", &cpu0_user);
    printf("%llu\n", cpu0_user);
    printf("%d\n", fsf_ret);
    return cpu0_user;
}
int
main(){
    get_cpu_perc();
    return 1;
}

Сказанное выше работает хорошо - оно выбирает первое число в строке, начинающееся с 'cpu'. Я хотел бы разделить это на общее количество на ядро ​​- это означает, что мне нужно изменить вызов fscanf () на

fscanf(file, "cpu0 %llu", &cpu0_user);

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

Поскольку это действительно не проблема, специфичная для * nix, ниже приведены несколько строк, которые повторяют поведение, которое я вижу, когда запускаю это для live / proc / stat. Вы могли бы сохранить это и проверить против него, если бы вы чувствовали такую ​​склонность.

cpu  5885032 59114 1477054 15427556 39113 0 36078 0 0 0
cpu0 2888239 29861 682033 7814849 22952 0 24266 0 0 0
cpu1 2996792 29253 795020 7612706 16160 0 11812 0 0 0

Мой вопрос таков: как заставить fscanf () сопоставляться со второй и третьей строками, а не только с первой? (Возможно, это связано с этим вопросом , но, честно говоря, я даже не делаю ничего такого фантастического и не связываюсь с регулярными выражениями здесь. Может, я что-то упустил?)

Ответы [ 2 ]

4 голосов
/ 16 сентября 2011

Это должно сделать это:

fscanf(file, "%*s %llu", &cpu0_user)

%*s говорит fscanf прочитать строку, но не назначать ее чему-либо.

0 голосов
/ 16 сентября 2011

fscanf () не ищет введенный текст.Если текст в начале потока не соответствует формату, ничего не возвращается.

Есть много подходов, которые вы могли бы использовать здесь.Можно использовать fgets (), чтобы получить строку, посмотреть на первые несколько символов, чтобы определить, какая это строка, а затем использовать fscanf () в правильном формате.

...