从文件中读取结构引起指针错误有没有办法解决? 保存结构的文件可能被破坏致使保存其中的结构数据可能不完整,这时读取到此不完整的结构数据会引起内存指针错误,有没有办法避免或捕捉这个错误? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 读到byte数组里,判断完了再memcpy到你的结构中。一点愚见捕捉这个错误好像不太可能吧!结构里多复杂也不一定的呀 可以在结构中加入整个结构的校验和,比如CRC校验等读取后,先计算校验和,如果正确可以说明极大概率该结构是正确的 比如说现在是win32环境,你的结构类似下面 typedef struct _test {int a;int b;char* ptr;}test;其中的ptr指向下面这个全局变量char g_string[128];比方说这个地址是0x10000000现在文件被破坏了,ptr的值是0x20000000这个地址难道非法了么? WingForce(初六,履霜,坚冰至。) 你说的没错。我想到一个方法不知道可行不:用结构数据与某个号码按特定方式加密,读取时先解密看是否可得到该号码,如果号码无误应该可以证明该结构数据是完整的,只是不知道如何实现。如果用结构数据做为密匙,那么结构数据可能需要一个副本,似乎不怎么可行。不知大家有没有什么简单的妙招? 你的思路不是和我前面提出的差不多,也不需要什么副本,直接把校验字段放在原来的结构中就行了,我那个绝对是可行的,因为网络协议中基本也就是这么做来保证报文的可靠性的,比如你的原始结构是这样: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进行比较,不一样就说明异常了 char* ptr;指针指向 0x10000000,你就把 0x10000000写入文件吗?如果是这样,那文件并没有被破坏,而是因为你的方法根本就是错误的. 可是这样做如果文件中的chk结构被破坏,在取出chk结构数据时不会发生指针或数据类型错误吗? 如果chk数据结构已经被改变,如何得到key并进行效验?你说的方法应该是数据要先读到chk结构中再效验呀,如果chk数据结构已经异常如何读入chk结构中? chk数据结构如果本身改变,那肯定校验失败你不需要管chk数据结构是否正确,你只需要从文件中“傻傻”的按chk结构的格式读取数据,不管那个key的位置是否是正确的值。因为如果该值错了,那概率上极大的保证校验失败。当然使用校验,只是概率上保证可靠,不过如果使用CRC校验的,冲突的概率极小,是可以忽略不计的 char* ptr;指针指向 0x10000000,你就把 0x10000000写入文件吗?如果是这样,那文件并没有被破坏,而是因为你的方法根本就是错误的.不是这样的,我在结构保存前将指针设置为空,它指向的字符另外保存。 下了一个CRC32,不过必须为char*类型的,不知道如何将 testtofile 转换为char*类型的数据?file.Write(&testtofile, sizeof(TESTToFile)); chk数据结构如果本身改变,那肯定校验失败你不需要管chk数据结构是否正确,你只需要从文件中“傻傻”的按chk结构的格式读取数据,不管那个key的位置是否是正确的值。因为如果该值错了,那概率上极大的保证校验失败。当然使用校验,只是概率上保证可靠,不过如果使用CRC校验的,冲突的概率极小,是可以忽略不计的-----------------------------------------------------------------------------------确实是这样,我只要‘傻傻’的读出结构就可以了,因为结构中没有指针,不会引起指针错误了。 运行MFC程序后有错误 百分求 类内存泄露问题 CSpreadSheet 关于错误C2146和C2051问题? 求助:关于DataGrid的读取 软件都快要写好了,给了同事代码! 如何去掉mfc生成的窗口标题栏的无标题而换上我定义的名字呢?20分相送 一个关于button的问题 在线等 怎么才能让Edit Box做到只能输入整数和小数? 请问:我在vc6中编译一个程序,编译后在FileView中自动添加上了External Dependencies文件夹,这是如何实现的? 怎样确定最佳乘车线路 上网究竟会留下甚么痕迹? 关于vc中不能使用系统的增加文件功能.
typedef struct _test {
int a;
int b;
char* ptr;
}test;其中的ptr指向下面这个全局变量
char g_string[128];比方说这个地址是0x10000000
现在文件被破坏了,ptr的值是0x20000000
这个地址难道非法了么?
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
进行比较,不一样就说明异常了
指针指向 0x10000000,
你就把 0x10000000写入文件吗?如果是这样,那文件并没有被破坏,
而是因为你的方法根本就是错误的.
你说的方法应该是数据要先读到chk结构中再效验呀,如果chk数据结构已经异常如何读入chk结构中?
指针指向 0x10000000,
你就把 0x10000000写入文件吗?如果是这样,那文件并没有被破坏,
而是因为你的方法根本就是错误的.
不是这样的,我在结构保存前将指针设置为空,它指向的字符另外保存。
-----------------------------------------------------------------------------------确实是这样,我只要‘傻傻’的读出结构就可以了,因为结构中没有指针,不会引起指针错误了。