C++ 使用fscanf读取/proc++;

C++ 使用fscanf读取/proc++;,c++,scanf,C++,Scanf,我目前正在开始编写一个程序,该程序将使用fscanf从/proc读取信息,我不确定从何处开始。通过查看proc(5)的手册页,我注意到您可以使用fscanf从/proc目录获取某些属性 例如,如果您正在读取proc/meminfo,则MemTotal%lu获取RAM的总可用量。然后,fscanf将看起来像: unsigned long memTotal=0; FILE* file = fopen("/proc/meminfo", "r"); fscanf(file, "MemTotal %lu"

我目前正在开始编写一个程序,该程序将使用
fscanf
/proc
读取信息,我不确定从何处开始。通过查看
proc(5)
的手册页,我注意到您可以使用
fscanf
/proc
目录获取某些属性

例如,如果您正在读取
proc/meminfo
,则
MemTotal%lu
获取RAM的总可用量。然后,
fscanf
将看起来像:

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

当我使用
fscanf
获取某些值时,我如何迭代文件。

我写了一些代码来精确地完成[好吧,这不完全是
“/proc/meminfo”
,而是前几天在工作中使用
scanf
“/proc/something”
读取数据

其原理是检查
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;
         }
     }
}
std::向量列表=
{{“MemTotal%lu”,&MemTotal},
{“MemFree%lu”,&MemFree},
...
};
bool done=false
而(!完成)
{ 
int res=0;
布尔发现了一些错误的东西;
用于(自动i:列表)
{
res=fscanf(文件,i.first.c_str(),i.second);
如果(res==EOF)
{
完成=正确;
打破
}
如果(res!=0)
{
发现某事=真实;
}
}
如果(!发现了什么)
{
//跳过不包含我们要查找的内容的行。
int-ch;
而((ch=fgetc(文件))!=EOF)
{
如果(ch='\n')
打破
}
}
}
这只是一个如何做到这一点的草图,但它应该给你一个想法