парсинг / proc / stat с использованием c ++ - PullRequest
0 голосов
/ 21 февраля 2019

Я новичок в c ++ и немного в Linux.У меня есть простой проект, который должен проанализировать статистику процессора из файла / proc / stat и вычислить загрузку процессора.Я попытался сделать это на полном сценарии Bash.но мне нужен с ++.Мне просто нужна небольшая помощь./ proc / stat дает много чисел, и я знаю, что разные столбцы представляют что-то.например, Пользователь, Ницца, Система, Idle и т. д. Например, я просто хочу получить значение Idle и сохранить его как Integer, используя c ++, как бы я это сделал?Пожалуйста помоги.То, что я попробовал сейчас, это просто получить всю нужную мне строку, используя ifstream и getline ()

std::ifstream filestat("/proc/stat");
std::string line;
std::getline(filestat,line);

, и вот что я получаю:

cpu  349585 0 30513 875546 0 935 0 0 0 0

Чтобы прояснить мой вопрос, дляНапример, я хочу получить значение 875546 и сохранить его в целое число, используя c ++.как бы я это сделал?спасибо

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Есть несколько способов решения проблемы.Вы можете использовать библиотеку регулярных выражений, чтобы получить часть строки, или если вы знаете, что это всегда идет к 5-му элементу, тогда вы можете использовать это:

std::string text = "cpu  349585 0 30513 875546 0 935 0 0 0 0";
std::istringstream iss(text);
std::vector<std::string> results(std::istream_iterator<std::string>{iss}, std::istream_iterator<std::string>());
int data = std::stoi( results[4] ); //check size before accessing 
std::cout << data << std::endl;

Надеюсь, это поможет.

0 голосов
/ 21 февраля 2019

Вам действительно нужно изучить, как работает ввод файлов.Это должно быть достаточно просто.Вам просто нужно игнорировать первые 3 символов "cpu" и затем читать 4 целочисленные значения:

unsigned n;
if(std::ifstream("/proc/stat").ignore(3) >> n >> n >> n >> n)
{
    // use n here...
    std::cout << n << '\n';
}

В качестве альтернативы, если у вас уже есть строка (возможно, вычтение файла по одной строке за раз) вы можете использовать std::istringstream, чтобы превратить строку в новый поток ввода:

std::ifstream filestat("/proc/stat");

std::string line;
std::getline(filestat, line);

unsigned n;
if(std::istringstream(line).ignore(3) >> n >> n >> n >> n)
{
    // use n here...
    std::cout << n << '\n';
}
...