-3

ファイルの解析に助けが必要

Device#  Device Name                 Serial No.                  Active Policy         Disk#         P.B.T.L        ALB
                                                                     Paths                                        
---------------------------------------------------------------------------------------    -------------------------------------
 1       AB      OPEN-V-CM           50 0BC1F1621                          1    SQST           Disk  2       3.1.4.0         N/A
 2       AB      OPEN-V-CM           50 0BC1F1605                          1    SQST           Disk  3       3.1.4.1         N/A
 3       AB      OPEN-V*2            50 0BC1F11D4                          1    SQST           Disk  4       3.1.4.2         N/A
 4       AB      OPEN-V-CM           50 0BC1F005A                          1    SQST           Disk  5       3.1.4.3         N/A

上記の情報は devices.txt ファイルにあり、入力したディスク番号に対応するデバイス番号を抽出したいと考えています。入力したディスク番号は単なる整数です (ファイルに示されている「ディスク 2」ではありません)。

4

5 に答える 5

2

ファイルを開き、最初の 3 行をスキップします。4 行目以降から 1 行ずつ読み始めます。最初の列なので、デバイス番号を簡単に取得できます。ディスク番号を取得するには、スペース文字を使用して各行を検索します。1 つの空白文字に遭遇すると、1 つの列を過ぎたことを意味します。繰り返されるスペースを無視して、ディスク番号に到達するまでこれを続けます。列データにスペースが存在する場合は、個別に処理する必要があります。

ディスク番号とデバイス番号をロードしてマップを言います。後で入力を使用して、このマップからデバイス情報を照会できます。

于 2012-07-04T05:52:05.503 に答える
0
#include <sstream>
#include <fstream>
#include <iostream>
#include <cctype>
using namespace std;

int main(int argc, char* argv[])
{
    int wantedDisknum = 4;
    int finalDeviceNum = -1;

    ifstream fin("test.txt");

    if(!fin.is_open())
        return -1;

    while(!fin.eof())
    {
        string line;
        getline(fin, line);
        stringstream ss(line);

        int deviceNum;
        ss >> deviceNum;
        if(ss.fail())
        {
            ss.clear();
            continue;
        }

        string unused;
        int diskNum;
        ss >> unused >> unused >> unused >> unused >> unused >> unused >> unused >> diskNum;

        if(diskNum == wantedDisknum)
        {
            finalDeviceNum = deviceNum;
            break;
        }
    }

    fin.close();
    cout << finalDeviceNum << endl;

    system("pause");
    return 0;
}
于 2012-07-04T06:31:14.117 に答える
0

次の列のいずれにも「ディスク」がないと仮定します。

1) 行の最初の文字として「-」に遭遇するまで行をスキップし、その行もスキップします。

2) 一行読む

2.a) isdigit(line[i]) 関数が true を返すまで現在の行の文字をスキップし、isdigit(line[i]) が false を返すまで現在の文字とそれに続く文字を一時バッファーに読み込みます。これはデバイス ID です。

2.b) 「D」が見つかるまで現在の行の文字をスキップする

2.bi) 「i」、「s」、「k」の文字に一致し、いずれかが失敗した場合は、2.b に進みます

2.c) isdigit(line[i]) 関数が true を返すまで現在の行の文字をスキップし、現在の文字とそれに続く文字を isdigit(line[i]) が false を返すまで別のバッファーに読み込みます。これはディスク ID です。

3) 両方のバッファを出力する

于 2012-07-04T06:29:27.287 に答える
0

UNIX では、awk やその他のスクリプト言語を使用してこれを簡単に実現できます。

cat Device.txt | awk '{if ( $1 == 2 ) print}'

C++ では、次の行を使用して特定の列を抽出しstrtok、一致する場合は 'val' と比較する必要があります。

于 2012-07-04T06:09:36.857 に答える
0

手元に正規表現チート シートはありませんが、ファイル内の各行を次のような正規表現で実行するのは簡単だと確信しています。

1) 行内の整数を探します 2) 空白とそれに続くテキストを 3 回スキップします 3) 文字と 1 つのスペースと文字に一致します

Boost、Qt、およびその他のほとんどの一般的な C++ クラス ライブラリには、まさにこの種のもののための Regex パーサーがあります。

于 2012-07-04T06:45:13.253 に答える