保存结构的文件可能被破坏致使保存其中的结构数据可能不完整,这时读取到此不完整的结构数据会引起内存指针错误,有没有办法避免或捕捉这个错误?

解决方案 »

  1.   

    读到byte数组里,判断完了再memcpy到你的结构中。一点愚见捕捉这个错误好像不太可能吧!结构里多复杂也不一定的呀
      

  2.   

    可以在结构中加入整个结构的校验和,比如CRC校验等读取后,先计算校验和,如果正确可以说明极大概率该结构是正确的
      

  3.   

    比如说现在是win32环境,你的结构类似下面
     
    typedef struct _test {
    int a;
    int b;
    char* ptr;
    }test;其中的ptr指向下面这个全局变量
    char g_string[128];比方说这个地址是0x10000000
    现在文件被破坏了,ptr的值是0x20000000
    这个地址难道非法了么?
      

  4.   

    WingForce(初六,履霜,坚冰至。) 你说的没错。我想到一个方法不知道可行不:用结构数据与某个号码按特定方式加密,读取时先解密看是否可得到该号码,如果号码无误应该可以证明该结构数据是完整的,只是不知道如何实现。如果用结构数据做为密匙,那么结构数据可能需要一个副本,似乎不怎么可行。不知大家有没有什么简单的妙招?
      

  5.   

    你的思路不是和我前面提出的差不多,也不需要什么副本,直接把校验字段放在原来的结构中就行了,我那个绝对是可行的,因为网络协议中基本也就是这么做来保证报文的可靠性的,比如你的原始结构是这样:
    typedef struct _test {
    int a;
    int b;
    char* ptr;
    }test;那么,你应该做类似这样修改
    typedef struct __chk {
    test t;
    int key;
    }chk;然后,在内存中处理数据时,使用test结构,当数据需要存储到文件中时,使用chk结构
    并且,将整个t字段进行CRC计算出一个校验和,将该和存入key中,然后才将chk结构存入文件读取的时候,读出chk结构后,做同样的处理,将t结构做CRC计算,得到校验和,将校验和与key
    进行比较,不一样就说明异常了
      

  6.   

    char* ptr;
    指针指向 0x10000000,
    你就把 0x10000000写入文件吗?如果是这样,那文件并没有被破坏,
    而是因为你的方法根本就是错误的.
      

  7.   

    可是这样做如果文件中的chk结构被破坏,在取出chk结构数据时不会发生指针或数据类型错误吗?
      

  8.   

    如果chk数据结构已经被改变,如何得到key并进行效验?
    你说的方法应该是数据要先读到chk结构中再效验呀,如果chk数据结构已经异常如何读入chk结构中?
      

  9.   

    chk数据结构如果本身改变,那肯定校验失败你不需要管chk数据结构是否正确,你只需要从文件中“傻傻”的按chk结构的格式读取数据,不管那个key的位置是否是正确的值。因为如果该值错了,那概率上极大的保证校验失败。当然使用校验,只是概率上保证可靠,不过如果使用CRC校验的,冲突的概率极小,是可以忽略不计的
      

  10.   

    char* ptr;
    指针指向 0x10000000,
    你就把 0x10000000写入文件吗?如果是这样,那文件并没有被破坏,
    而是因为你的方法根本就是错误的.
    不是这样的,我在结构保存前将指针设置为空,它指向的字符另外保存。
      

  11.   

    下了一个CRC32,不过必须为char*类型的,不知道如何将 testtofile 转换为char*类型的数据?file.Write(&testtofile, sizeof(TESTToFile));
      

  12.   

    chk数据结构如果本身改变,那肯定校验失败你不需要管chk数据结构是否正确,你只需要从文件中“傻傻”的按chk结构的格式读取数据,不管那个key的位置是否是正确的值。因为如果该值错了,那概率上极大的保证校验失败。当然使用校验,只是概率上保证可靠,不过如果使用CRC校验的,冲突的概率极小,是可以忽略不计的
    -----------------------------------------------------------------------------------确实是这样,我只要‘傻傻’的读出结构就可以了,因为结构中没有指针,不会引起指针错误了。