使用fread时分段错误而无法从文件中读取数据

时间:2011-05-11 13:15:01

标签: c

这里想要复制文件enter_data中的数据并将其传递给函数insert(key,keys)但是我得到了一个分段错误,而且我无法从文件中读取数据

这里分类器是一个结构,而packet_filter有ip和udp的结构,我想输入src和dst ip adddress和src以及dst端口号

    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;

2 个答案:

答案 0 :(得分:1)

这不起作用,因为您尝试读取二进制文件,而您的文件是文本。

第二 - 在尝试打开文件后,您需要检查fp是否为NULL - 只是一个建议。

第三 - 即使文件是二进制文件,这也不行,如

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

应该是

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

由于keys不是一个数组,你只需要在块上阅读。

答案 1 :(得分:-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);
}