【问题标题】:printf() not printing correct computationprintf() 没有打印正确的计算
【发布时间】:2014-11-20 18:19:13
【问题描述】:

这里是C++程序员,需要快速解决以下问题。

我需要执行以下减法运算,从文件中获取输入并将所需的数字存储在变量中。但是 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 行的输出,因为我只需要将它们存储在变量中。

编辑:固定长整数。

谢谢

【问题讨论】:

  • 1) system 的返回值类型为int。 2) grep 的返回值不是显示值。
  • @BLUEPIXY 啊,是的,1 已修复,如何进行第 2 次?我应该如何将 grep(显示值)存储在 var 中?
  • 通过管道从文件流接收(使用popen)。
  • 只是想建议也许使用sysinfo 来获取此信息...

标签: c linux operating-system


【解决方案1】:

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);
}

【讨论】:

  • 真的很有帮助,没有太多使用 popen() 的例子。
【解决方案2】:

/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 因为它吃,嗯,记忆)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2020-11-09
    • 2016-07-31
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多