C++ 使用ifstream::open";meminfo“;,fileLen是-1
代码如下:C++ 使用ifstream::open";meminfo“;,fileLen是-1,c++,linux,ifstream,C++,Linux,Ifstream,代码如下: #include <iostream> #include <stdio.h> #include <unistd.h> #include <fstream> #include <memory.h> int main() { std::ifstream file; file.open("/proc/meminfo"); if(file.fail()) return 0; file.seekg(0, std::ios
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <fstream>
#include <memory.h>
int main()
{
std::ifstream file;
file.open("/proc/meminfo");
if(file.fail())
return 0;
file.seekg(0, std::ios::end);
int fileLen = file.tellg();
file.seekg(0, std::ios::beg);
char buffer[fileLen + 1];
memset(buffer, 0, fileLen + 1);
file.read(buffer, fileLen + 1);
if(file.fail())
return 0;
unsigned long long total = 0;
unsigned long long free = 0;
sscanf(buffer, "%*s %llu%*s%llu", &total, &free);
file.close();
return 1;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
std::ifstream文件;
打开(“/proc/meminfo”);
if(file.fail())
返回0;
seekg(0,std::ios::end);
int fileLen=file.tellg();
seekg(0,std::ios::beg);
字符缓冲区[fileLen+1];
memset(缓冲区,0,fileLen+1);
读取(缓冲区,fileLen+1);
if(file.fail())
返回0;
无符号长总计=0;
无符号长自由=0;
sscanf(缓冲区,%*s%llu%*s%llu“,&total,&free);
file.close();
返回1;
}
在代码中,fileLen
是-1,但我不知道原因。如果ifstream
打开不同的文件,如1.txt
,则程序是正确的。
最后,感谢您的帮助
/proc
的内容不是真实的文件,因此没有实际大小。不要试图获取它们的大小,而只是正常地读取和解析它们。/proc的内容不是真实的文件,因此没有实际的大小。不要试图获取它们的大小,而是简单地正常读取和分析它们。因为这不是一个普通文件:
proc文件系统是一个以/proc为根的伪文件系统,它包含用户可访问的对象,这些对象与内核的运行时状态有关,并扩展为运行在内核上的执行进程。之所以使用“Pseudo”,是因为proc文件系统仅作为其显示的内存内核数据结构的反映而存在。这就是为什么/proc中的大多数文件和目录的大小都是0字节
因为这不是一个普通文件: proc文件系统是一个以/proc为根的伪文件系统,它包含用户可访问的对象,这些对象与内核的运行时状态有关,并扩展为运行在内核上的执行进程。之所以使用“Pseudo”,是因为proc文件系统仅作为其显示的内存内核数据结构的反映而存在。这就是为什么/proc中的大多数文件和目录的大小都是0字节
我认为原因可能是
/proc/meminfo
实际上不是一个文件/proc
不包含真实文件,它们只是系统当前状态的快照
我认为原因可能是
/proc/meminfo
实际上不是一个文件/proc
不包含真实文件,它们只是系统当前状态的快照
是的,我应该对linux有更好的了解,非常感谢。是的,我应该对linux有更好的了解,非常感谢。