使用fscanf从/ proc C ++中读取

时间:2016-02-12 22:32:43

标签: c++ scanf

我目前正在开始编写一个程序,该程序将使用/procfscanf读取信息,我不知道从哪里开始。浏览proc(5)的手册页,我注意到您可以使用fscanf/proc目录中获取某些属性。

例如MemTotal %lu如果您正在阅读proc/meminfo,则会获得可用的总RAM数量。然后fscanf会是这样的:

unsigned long memTotal=0;
FILE* file = fopen("/proc/meminfo", "r");
fscanf(file, "MemTotal %lu", &memTotal);

如何在使用fscanf获取特定值时迭代文件。

1 个答案:

答案 0 :(得分:1)

我写了一些准确的代码[嗯,它不完全是"/proc/meminfo",但是前几天在工作中使用"/proc/something"读取scanf的数据。

原则是检查fscanf的返回值。对于输入结束,它将是EOF,0或1,没有得到任何东西,找到了你想要的东西。如果结果是EOF,则退出循环。如果你的所有采样点都为0,你需要做一些其他的事情来跳过这一行 - 我在fgetc()周围使用一个循环来读取该行。

如果你想阅读几个元素,最好用某种列表来做。

我可能会这样做:

std::vector<std::pair<std::string, unsigned long* value>> list = 
    { { "MemTotal %lu", &memTotal },
      { "MemFree %lu",  &memFree },
      ...
    };

bool done = false
while(!done)
{ 
     int res = 0;

     bool found_something = false;
     for(auto i : list)
     {
        res = fscanf(file, i.first.c_str(), i.second);
        if (res == EOF)
        {
           done = true;
           break;
        }
        if (res != 0)
        {
           found_something = true;
        }
     }
     if (!found_something)
     {
         // Skip line that didn't contain what we were looking for.
         int ch;
         while((ch = fgetc(file)) != EOF)
         {
             if (ch == '\n')
                break;
         }
     }
}

这只是如何做到这一点的草图,但它应该给你一个想法。