我正在尝试读取文件(特别是/ 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()与第二行和第三行匹配而不仅仅是第一行? (这可能与this question有关,但老实说 - 我甚至没有做任何如此花哨的事情,也没有搞乱正则表达式。也许我错过了什么?)
答案 0 :(得分:4)
这应该这样做:
fscanf(file, "%*s %llu", &cpu0_user)
%*s
告诉fscanf读取字符串但不将其分配给任何内容。
答案 1 :(得分:0)
fscanf()不搜索输入文本。如果流开头的文本与格式不匹配,则不返回任何内容。
您可以在此处使用许多方法。一种可能是使用fgets()获取一行,查看前几个字符以确定它是哪一行,然后使用具有正确格式的fscanf()。