2014-11-20 105 views
0

C++程序员在这里需要一个快速解决下面问题的方法。printf()不打印正确的计算

我需要执行以下减法,其中从文件中获取输入并将所需数字存储在变量中。但是printf()显示为0。

#include<stdio.h> 

main() 
{ system("clear"); 
    system("cat /proc/meminfo | grep MemTotal"); 
    system("cat /proc/meminfo | grep MemFree "); 
    int a=system("cat /proc/meminfo | grep MemTotal | grep -Eo [0-9]+"); 
    int b=system("cat /proc/meminfo | grep MemFree | grep -Eo [0-9]+"); 
    int c=a-b; 
    printf("%d \n",c); 
} 

输出为如下:

MemTotal:  3913212 kB 
MemFree:   1769672 kB 
3913212 
1769388 
0 

而且是有办法剿从代码中第7和第8行输出我只需要他们的变量来存储。

编辑:固定长整数。

谢谢

+0

1)'system'的返回值类型是'int'。 2)grep的返回值不是显示值。 – BLUEPIXY 2014-11-20 18:25:28

+0

@BLUEPIXY啊是的,1固定和如何去约2?我应该如何将grep(显示值)存储在var中? – 2014-11-20 18:27:14

+0

通过管道从文件流接收(使用'popen')。 – BLUEPIXY 2014-11-20 18:29:48

回答

2

popen样品(测试)。

#include <stdio.h> 

int main(){ 
    system("clear"); 
    system(" grep MemTotal /proc/meminfo"); 
    system(" grep MemFree /proc/meminfo"); 

    int totalMem=0 , freeMem=0; 
    FILE *fp = popen("grep MemTotal /proc/meminfo | grep -Eo [0-9]+", "r"); 
    FILE *fp1 = popen("grep MemFree /proc/meminfo | grep -Eo [0-9]+", "r"); 
    fscanf(fp, "%d", &totalMem); 
    fscanf(fp1, "%d", &freeMem); 
    printf("%d \n",totalMem-freeMem); 
    pclose(fp); 
    pclose(fp1); 
} 
+0

真的帮助,与没有太多使用popen()的例子。 – 2014-11-20 18:54:36

1

/proc/meminfo是一个特殊的文件,从内核到用户空间的映射。访问这些信息的最简单的方法是...不解析文件,但使用系统调用来代替:

// build: cc -o mratio-si mratio-si.c 
// usage: ./mratio-si 
#include <sys/sysinfo.h> 
#include <stdio.h> 

int main() { 
    struct sysinfo si; 
    if (sysinfo(&si) == 0) { 
     printf("%d/%d (%.2f)\n", si.freeram, si.totalram,. 
      (float)si.freeram/(float)si.totalram); 
    }; 
    return 0; 
} 

,或者因为我们手边有一个真正的编程语言,解析/proc/meminfo自己:

// build: cc -o mratio-parse mratio-parse.c 
// usage: ./mratio-parse < /proc/meminfo 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char* argv[]) { 

    const char MEMTOTAL[] = "MemTotal:"; const char MEMFREE[] = "MemFree:"; 
    long val, memfree = 0, memtotal = 0; 
    char buf[256]; void* ignore; int ok = 0; 

    for (; ok != EOF && !(memfree > 0 && memtotal > 0);){ 
     ok = fscanf(stdin, "%255s %d %*s\n", buf, &val, ignore); 
     if (ok == 0) { return 1; } 
     if (strncmp(buf, MEMTOTAL, sizeof(MEMTOTAL)-1) == 0) { 
      memtotal = val; 
     } else if (strncmp(buf, MEMFREE, sizeof(MEMFREE)-1) == 0) { 
      memfree = val; 
     } 
    } 

    if (memfree == 0 || memtotal == 0) { 
     perror("parse error, did not find 'MemFree' or 'MemTotal'\n"); 
     return 1; 
    } 

    printf("%d/%d (%.2f)\n", memfree, memtotal, (float)memfree/(float)memtotal); 
    return 0; 
} 

在任何情况下,使用popen()显然也是可能的,但有一些开销(和一致性问题,因为在第一个grep和最后一次调用之间有一段时间,调用grep本身发生变化/proc/meminfo,因为它吃,记忆)。