我目前正在使用C程序来获取特定的CPU信息,例如cpu模型或cpu具有多少个内核。
在Linux上,一种方法是读取“ / proc / cpuinfo”。 问题:我不希望所有内容都被打印出来。我只想打印出包含“模型名称”和“ cpu核心”的行。
#include <stdio.h>
int main() {
char cpuinfo;
FILE *fp = fopen("/proc/xcpuinfo", "r");
if (fp == NULL) {
fprintf(stderr, "Error opening file\n");
} else {
while ((cpuinfo = fgetc(fp)) != EOF) {
printf("%c", cpuinfo);
}
fclose(fp);
}
return 0;
}
答案 0 :(得分:0)
使用POSIX getline
的简单解决方案:
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("/proc/cpuinfo", "r");
assert(fp != NULL);
size_t n = 0;
char *line = NULL;
while (getline(&line, &n, fp) > 0) {
if (strstr(line, "model name") || strstr(line, "cpu cores")) {
printf("%s", line);
}
}
free(line);
fclose(fp);
return errno;
}
如果没有getline
,则可以使用足够大的行缓冲区char buf[200];
并使用fgets(buf, sizeof(buf), fp)
,也可以自己实现简单的getline
。
答案 1 :(得分:0)
另一种选择是将文件名和术语作为参数传递给程序,而不是硬编码文件名和搜索项。使用您的搜索字词,您可以使用strncmp
与每个字符串中相同数量的前导字符进行比较,并输出任何匹配的行(或存储它们,等等。)
fgetc
一次只能读取一个字符,而fgets
(如POSIX getline
)是面向行的输入函数,将读取整个字符。一次一行(提供足够大小的缓冲区-不要忽略缓冲区大小)
将所有内容放在一起,以便程序将要读取的文件名作为第一个参数,然后将任意数量的搜索词(达到argv
的限制)作为后续参数,您可以执行以下操作: / p>
#include <stdio.h>
#include <string.h>
#define MAXC 2048 /* if you need a constant, #define one (or more) */
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line in file */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : NULL; /* open file */
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read each line */
for (int i = 2; i < argc; i++) { /* loop over terms */
char *cmpstr = argv[i]; /* compare string */
size_t cmplen = strlen (cmpstr); /* length to compare */
if (strncmp (buf, cmpstr, cmplen) == 0) /* does start match? */
fputs (buf, stdout); /* output string */
}
}
fclose (fp); /* close file */
return 0;
}
使用/输出示例
$ ./bin/cmpleadingstr2 /proc/cpuinfo "model name" "cpu cores"
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
或
$ ./bin/cmpleadingstr2 /proc/cpuinfo "processor"
processor : 0
processor : 1
processor : 2
processor : 3