2014-11-20 101 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,因爲它吃,記憶)。