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')
打破
}
}
}
这只是一个如何做到这一点的草图,但它应该给你一个想法