如何在C++程序中提取nvidia-smi输出的GPU电压数值?
提取nvidia-smi输出中数值的C++实现方法
第一步:捕获命令的输出内容
C++中无法直接通过console()获取命令输出,建议使用popen()函数执行外部命令并读取其输出流。示例代码如下:
#include <iostream> #include <string> #include <cstdio> std::string executeCommand(const char* cmd) { char buffer[128]; std::string result = ""; FILE* pipe = popen(cmd, "r"); if (!pipe) { return "Error: Failed to execute command"; } while (fgets(buffer, sizeof(buffer), pipe) != nullptr) { result += buffer; } pclose(pipe); return result; }
调用这个函数就能获取nvidia-smi -q -i 0(注:原命令-i voltage有误,-i参数后应跟GPU索引,比如0)的完整输出内容。
第二步:从输出中提取目标数值
方法1:使用正则表达式(通用且简洁)
C++11及以上版本支持<regex>库,通过匹配包含数字和小数点的模式,可轻松提取数值。以提取电压为例:
#include <regex> #include <vector> std::vector<std::string> extractNumbers(const std::string& input) { std::vector<std::string> numbers; std::regex numRegex(R"(\d+\.\d+)"); // 匹配带小数点的数值,如需整数可调整为\d+ std::sregex_iterator it(input.begin(), input.end(), numRegex); std::sregex_iterator end; for (; it != end; ++it) { numbers.push_back((*it).str()); } return numbers; } // 使用示例 int main() { std::string output = executeCommand("nvidia-smi -q -i 0 | grep -A 5 \"Voltage\""); std::vector<std::string> voltages = extractNumbers(output); if (!voltages.empty()) { std::cout << "GPU当前电压:" << voltages[0] << " mV" << std::endl; } return 0; }
这个方法适用于所有类似场景,只要调整正则表达式的匹配模式(比如匹配整数、带单位的数值等),就能提取其他命令输出中的数字。
方法2:逐字符解析(无需依赖正则库)
如果环境不支持C++11正则,也可以手动遍历字符串,筛选出数字和小数点:
std::string extractFirstNumber(const std::string& input) { std::string number; bool hasDecimal = false; for (char c : input) { if (isdigit(c)) { number += c; } else if (c == '.' && !hasDecimal) { number += c; hasDecimal = true; } else if (!number.empty()) { // 遇到非数字且已开始匹配,提前结束 break; } } return number; } // 使用示例 int main() { std::string output = executeCommand("nvidia-smi -q -i 0 | grep \"Graphics Voltage\""); std::string voltage = extractFirstNumber(output); std::cout << "GPU当前电压:" << voltage << " mV" << std::endl; return 0; }
这个方法通过逐字符判断,提取第一个连续的数值字符串,适合格式固定的输出场景。
注意事项
- 确保
nvidia-smi命令路径正确,Windows环境下可能需要指定完整路径(比如C:\\Program Files\\NVIDIA Corporation\\NVSMI\\nvidia-smi.exe)。 - 可结合
grep(Linux/macOS)或findstr(Windows)命令缩小输出范围,减少解析工作量。
内容的提问来源于stack exchange,提问作者JackDerke
相关产品推荐
相关产品推荐

