2013-05-02 83 views
0

我需要編寫一個圖形文件解析器(由TGFF產生的圖形作爲標識符/變量的基於文本文件)C++自定義文本代碼輸入解析器

@TASK_GRAPH 0 { 
PERIOD 1100 

TASK t0_0 TYPE 13 
TASK t0_1 TYPE 3 
TASK t0_2 TYPE 10 
    . 
    . 

ARC a0_0 FROM t0_0 TO t0_1 TYPE 9 
ARC a0_1 FROM t0_1 TO t0_2 TYPE 0 
ARC a0_2 FROM t0_2 TO t0_3 TYPE 37 
    . 
    . 
} 

#------------------------------------------------------------------------------ 
# type exec_time 
    0  71.659 
    1  59.3856 
    2  64.7101 

這是儘可能IV得到迄今(不介意支離破碎的代碼......這只是一個例子,如何IV迄今所做的)

void read(char* graph){ 
    //open task graph description 
    string name; 
    string TaskList[300][300]; 
    ifstream gfile; 
    gfile.open (graph); 
    if (!gfile.is_open()) cout<<"Could not open graph description file\n"; 
    //start parsing 
    while(getline(gfile,inptext)){ 
     istringstream sstream(inptext); 
     int i=0; 
     sstream >> name; 
     if(name.compare("TASK")==0){ 
      sstream >> name;i 
      //wrte node name to hash index i++ 
      sstream >> name; 
      if (name.compare("TYPE")==0){ 
       sstream >> name; 
       //retrieve node index from hash 
       //write node weight to matrix 
      } 
     } 
     if(name.compare("ARC")==0){ 
      sstream >> name; 
      //write edge name to hash index i++ 
      sstream >> name; 
      if (name.compare("FROM")==0){ 
       sstream >> name; 
       //retrieve node index a from hash 
      } 
      sstream >> name; 
      if (name.compare("TO")==0){ 
       sstream >> name; 
       //retrieve node index b from hash 
       if (name.compare("TYPE")==0){ 
       sstream >> name; 
       //write edge weight to matrix index a b 
       } 
      } 
     } 
     i++; 
    } 
    //end parsing 
    gfile.close(); 
} 

由於我沒有與令牌工作之前,我沒有打擾他們讀了。現在我遇到的問題是文件底部的TYPE值的讀取週期,因爲它們的標識符是常規數字,您不能讓它們作爲搜索的標識符。我猜最好的方法是尋找「#類型」,但因爲我使用字符串流有點難以應付。第二個問題是,節點的數目是預先未知,所以我不能初始化數組矩陣以適合圖的大小...

應該I:

  • a)到文件中讀取兩次 - b)使用矢量/矩陣類型(我以前沒有用過,我認爲我必須建立一個矩陣類)
  • c)使用向量/矩陣類型別的

我想的矩陣應當是 矩陣[X] [X],其中n是節點的重量和e是邊緣權重(由於邊緣取消鏡像僅去單程)到目前爲止我計劃來填充型數字矩陣後來讀散列或載體的類型和正確的值

A B C D E 
A n 0 0 0 0 
B e n 0 0 0 
C e e n 0 0 
D e e e n 0 
E e e e e n 

如果有人知道如何閱讀和更輕鬆地分析這個文件將是巨大的替換它們。

回答

1

對於尋址映射任務名稱的問題標識符例如映射t0_0爲0, t0_1到1以及處理其它格式節點名稱,我會建議與任務名散列表作爲密鑰和矩陣索引作爲值。下面

該函數將返回給定的任務名稱索引。如果任務名稱首次被滿足,它將創建一個新的索引,將其分配給任務名稱並返回該名稱。

#include <unordered_map> 
int tasks = 0; 
std::unordered_map<std::string, int> hashNameToIndex; 

int nameToIndex(string name){  
    if (hashNameToIndex.find(name) == hashNameToIndex.end()){ 
    hashNameToIndex[name] = tasks; 
    tasks++; 
    return tasks-1; 
    }else{ 
    return hashNameToIndex[name]; 
    } 
} 
+0

一個很好的建議,使用djb2方法散列到目前爲止,關於如何雖然解析類型值的任何想法了? – 2013-05-02 15:27:40

+0

我不明白什麼叫「分析類型值」 – 2013-05-02 22:11:31

+0

文件例如我上面貼有標明每個任務和弧型值意味着....現在這些類型的實際重量/值標記列表在文件的底部,「0 71.659」表示類型0,值爲71.659。我需要用它們各自的值替換這些類型標識符....我將如何解析這些值作爲類型標識符是常規整數數字? – 2013-05-03 09:33:05