1

Linux で CPU 情報を解析したい。私はそのようなコードを書きました:

// Returns full data of the file in a string
std::string filedata = readFile("/proc/cpuinfo");

std::cmath results;
// In file that string looks like: 'model name : Intel ...'
std::regex reg("model name: *");
std::regex_search(filedata.c_str(), results, reg);

std::cout << results[0] << " " << results[1] << std::endl;

しかし、空の文字列を返します。どうしたの?

4

3 に答える 3

5

すべてのコンパイラが完全な C++11 仕様をサポートしているわけではありません。特に、regex_searchGCC (バージョン 4.7.1 以降) では機能しませんが、VC++ 2010 では機能します。

于 2012-08-08T10:02:53.920 に答える
3

式でキャプチャが指定されていません。

の構造を考えると、一度にすべてを実行しようとするよりも/proc/cpuinfo、 を使用して行指向の入力を好むでしょう。std::getlineしたがって、次のような結果になります。

std::string line;
while ( std::getline( input, line ) ) {
    static std::regex const procInfo( "model name\\s*: (.*)" );
    std::cmatch results;
    if ( std::regex_match( line, results, procInfo ) ) {
        std::cout << "???" << " " << results[1] << std::endl;
    }
}

あなたが出力として何を望んでいたかは私には明らかではありません。おそらく、processor行もキャプチャして、プロセッサ情報行の先頭に出力する必要があります。

注意すべき重要事項は次のとおりです。

  1. さまざまな量の空白を受け入れる必要があります"\\s*"。0 以上、"\\s+"1 つ以上の空白文字に使用します。

  2. キャプチャする対象を区切るには、括弧を使用する必要があります。

boost::regex(FWIW: 私は にアクセスできないので、実際には に基づいてステートメントstd::regexを書いています。ただし、それらはかなり似ていると思います。上記のステートメントは両方に適用されます。)

于 2012-08-08T10:44:54.960 に答える
2

試してみてくださいstd::regex reg("model_name *: *")。私のcpuinfoでは、コロンの前にスペースがあります。

于 2012-08-08T10:06:23.667 に答える