2012-07-04 34 views
-3

需要在解析文件解析在C密鑰值/ C++

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」)。

回答

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; 
} 
+0

哇......非常感謝Nick。經過測試和它的工作。:) – Veekay

+0

你可以通過點擊左邊的複選標記來接受答案= D – bitwise

2

打開文件並跳過前3行。 從4行開始逐行讀取。因爲它是第一列,您可以輕鬆獲取設備編號。 要獲取磁盤號,請使用空格字符搜索每行。當你遇到一個空格字符時,這意味着你已經走過了一列。 忽略重複的空格並繼續執行此操作,直到達到磁盤編號。如果存在,則必須單獨處理列數據中的空格。

將磁盤號和設備號加載到地圖中,稍後可以使用輸入從該地圖查詢設備信息。

+0

感謝Ragesh,因爲我擁有的關鍵值是磁盤#而不是設備#和設備#在每一行的開始。我想知道如果我必須保持設備#在一個臨時變量直到該行的末尾,如果發現返回該設備#否則繼續下一行。你認爲它是一個好方法嗎?我不知道地圖,所以不知道如何去做。 – Veekay

+0

在開始時讀取整個文件,並將其加載到數據結構中,例如包含磁盤#和設備#的結構數組或磁盤#是唯一的映射。當需要時,您可以使用磁盤#在數組中搜索或查找映射。 –

0

在UNIX中,您可以使用awk或其他腳本lang輕鬆實現此操作。

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

在C++中,你必須使用strtok提取特定的列,並將其與「VAL」比較,如果它匹配打印該行「。

+0

是的,我會嘗試使用strtok來獲得每一行。也可以請任何人幫助我的示例代碼片段? – Veekay

0

假設沒有「磁盤」,在以下任一列:

1)跳過行,直到你遇到「 - 」作爲一行的第一個字符,然後跳過該行也。

2)讀取一行

2.A)跳過當前行的字符,直到ISDIGIT(線[1])函數返回真,則讀取當前字符和其後到臨時緩衝區,直到ISDIGIT字符( line [i])返回false。這是設備ID。

2.B),直到你找到一個「d」

2.bi)匹配「我」,「S」跳過當前行的字符,「K」字,如果其中任何一個失敗,請到2.b

2.c)跳過當前行的字符,直到isdigit(line [i])函數返回true,然後將當前字符和字符跟隨它讀入另一個緩衝區,直到isdigit(line [i])返回假。這是磁盤ID。

3)打印出兩個緩衝器

0

我沒有我的正則表達式小抄方便,但我敢肯定,這將是簡單的通過一個正則表達式來運行該文件中的每一行:

1)會在線路 2一個整數)跳過空白後跟文本三次 3)匹配字符中的一個空間和字符

升壓,Qt的,並且最常見的其它的C++類庫有一個正則表達式分析器只是這種事情。