Я пытаюсь прочитать файл (в частности / 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 () сопоставляться со второй и третьей строками, а не только с первой? (Возможно, это связано с этим вопросом , но, честно говоря, я даже не делаю ничего такого фантастического и не связываюсь с регулярными выражениями здесь. Может, я что-то упустил?)