-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 行开始逐行阅读。您可以轻松获取设备编号,因为它是第一列。要获取磁盘编号,请使用空格字符搜索每一行。当您遇到一个空格字符时,这意味着您已经过了一列。忽略重复的空格并继续此操作,直到找到磁盘编号。如果存在,您必须单独处理列数据中的空格。

将磁盘编号和设备编号加载到地图中,稍后您可以使用输入从该地图中查询设备信息。

于 2012-07-04T05:52:05.503 回答
0

在 UNIX 中,您可以使用 awk 或其他脚本语言轻松实现此目的。

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

在 C++ 中,您必须使用提取特定列strtok并将其与 'val' 进行比较,如果它匹配打印该行。

于 2012-07-04T06:09:36.857 回答
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
#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) 跳过空格后跟文本 3 次 3) 匹配字符一个空格和字符

Boost、Qt 和大多数其他常见的 C++ 类库都有一个正则表达式解析器来处理这类事情。

于 2012-07-04T06:45:13.253 回答