我目前正在开始编写一个程序,该程序将使用/proc
从fscanf
读取信息,我不知道从哪里开始。浏览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
获取特定值时迭代文件。
答案 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;
}
}
}
这只是如何做到这一点的草图,但它应该给你一个想法。