fscanf匹配一行,但不匹配另一行,类似的行

时间:2011-09-15 23:40:04

标签: c file-io scanf

我正在尝试读取文件(特别是/ 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有关,但老实说 - 我甚至没有做任何如此花哨的事情,也没有搞乱正则表达式。也许我错过了什么?)

2 个答案:

答案 0 :(得分:4)

这应该这样做:

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

%*s告诉fscanf读取字符串但不将其分配给任何内容。

答案 1 :(得分:0)

fscanf()不搜索输入文本。如果流开头的文本与格式不匹配,则不返回任何内容。

您可以在此处使用许多方法。一种可能是使用fgets()获取一行,查看前几个字符以确定它是哪一行,然后使用具有正确格式的fscanf()。