2011-05-11 58 views
0

這裏想從文件enter_data中複製數據並將其傳遞給函數insert(key,keys),但是我得到了一個分段錯誤,我無法從文件使用fread時分段錯誤,並且無法讀取文件中的數據

這裏的分類是一個結構,packet_filter具有IP和UDP的結構,我想進入src和目標IP地址經過和src和目標端口號

struct classifier 
    { 
     int key_node; 
     struct packet_filter pktFltr; 
     struct classifier *next; 
    }__attribute__((packed)); 




    void addrule(struct classifier keys) 
    { 
      int key; 
      FILE *fp; 
      fp = fopen("enter_data","r"); 
      fread(&keys, sizeof (struct classifier), 3, fp); 
      insert(key,keys); 
      fclose(fp); 
    } 
讀取數據
    file: enter_data 

     key = 822; 
     keys.key_node = 822; 
     inet_aton("172.28.6.137", &(keys.pktFltr.ip.ip_src)); 
     inet_aton("172.28.6.10",&(keys.pktFltr.ip.ip_dst)); 
     keys.pktFltr.protocol.proto.uh_sport = ntohs(1032); 
     keys.pktFltr.protocol.proto.uh_dport = ntohs(5000); 
     keys.next = NULL; 


     key = 522 ; 
     keys.key_node = 522; 
     inet_aton("172.28.6.87", &(keys.pktFltr.ip.ip_src)); 
     inet_aton("172.28.6.110",&(keys.pktFltr.ip.ip_dst)); 
     keys.pktFltr.protocol.proto.uh_sport = ntohs(1032); 
     keys.pktFltr.protocol.proto.uh_dport = ntohs(5010); 
     keys.next = NULL; 

     key = 522 ; 
     keys.key_node = 522; 
     inet_aton("172.28.6.87", &(keys.pktFltr.ip.ip_src)); 
     inet_aton("172.28.6.110",&(keys.pktFltr.ip.ip_dst)); 
     keys.pktFltr.protocol.proto.uh_sport = ntohs(1032); 
     keys.pktFltr.protocol.proto.uh_dport = ntohs(5011); 
     keys.next = NULL; 

+0

您是否嘗試過該代碼運行調試,以確定究竟是段錯誤? – 2011-05-11 13:19:22

+1

如果第二篇文章是你的文件,那麼這段代碼將不起作用。您正在嘗試使用二進制序列化進行讀取,但您的文件是一個文本文件。 – Chad 2011-05-11 13:19:35

回答

1

這不起作用,因爲您嘗試讀取二進制文件,而您的文件是文本。

其次 - 您需要在嘗試打開文件後檢查fp是否爲NULL - 只是一個建議。

三 - 即使文件是二進制的,這是行不通的,因爲

fread(&keys, sizeof (struct classifier), 3, fp); 

應該

//          vvv 
fread(&keys, sizeof (struct classifier), 1, fp); 

由於keys不是一個數組,你需要閱讀只是塊。

+1

不知道你爲什麼說「只是一個建議」。檢查fopen是否成功至關重要。未能檢查它會導致無法使用的程序。 – 2011-05-11 15:28:01

+0

@威廉 - 只是不想聽起來「太難」:D它是程序員的責任**總是**檢查使用函數的返回碼(當然,如果有的話) – 2011-05-11 17:19:14

-1

您似乎沒有爲您的3個密鑰分配足夠的空間。

void addrule(struct classifier keys) 
{ 
.... 
    fread(&keys, sizeof (struct classifier), 3, fp); // Here you read 3 keys and put into &keys, but you gave only one struct to your method 

也許有循環讀取每一個關鍵:

void addrule(struct classifier keys) 
{ 
.... 
    while fread(&keys, sizeof (struct classifier), 1, fp) 
    { 
     insert(key,keys); 
    } 
    fclose(fp); 
} 
+0

不僅如此,這將適用於二進制文件,看起來,它是文本文件。 – 2011-05-11 13:24:17

+0

是的,我只有一個結構,但我必須輸入不同的數據到相同的結構,並不斷傳遞結構,我怎麼能做到這一點。 – sandeep 2011-05-11 13:26:00

+0

@sandeep:我用一個循環編輯我的答案,以便逐一插入密鑰 – 2011-05-11 14:25:20

相關問題