首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

fread string的有关问题

2013-08-09 
fread string的问题请教各位高手一个问题:下面两个程序的的作用是将一个pair写入文件,然后再读出来。第一个

fread string的问题
请教各位高手一个问题:
下面两个程序的的作用是将一个pair写入文件,然后再读出来。第一个程序运行完,myPair为("orange",1);
第二个运行完为("apple",1)。也就是说,第一个程序并没有把文件中读出的值赋给myPair。

我对string在或者含string的pair在文件中的存储方式有些疑惑。string对象的大小恒定为28个字节(VS2012),程序可以根据指针去找string.pointer去找到对应的字符串。
但是,将string或者上述定义的pair存到文件的时候,到底是一种什么样的存储方法呢?string对应的字符串的长度也不一致。

另外,当从文件中读取存储的pair数据时,当Key为string的时候,会遇到这种情况:
文件读取,从文件中读取数据的使用都正常,但是当函数退出的时候,出现错误。错误的提示为:

0x545CCCC8 (msvcp110d.dll) (TradeAnalyzer.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x0065CEA4 时发生访问冲突。

中断处为xstring, 

void _Free_proxy()
{// destroy proxy
typename _Alloc::template rebind<_Container_proxy>::other
_Alproxy;
this->_Orphan_all();
_Alproxy.destroy(this->_Myproxy);
_Alproxy.deallocate(this->_Myproxy, 1);
this->_Myproxy = 0;
}


请问各位这两个问题:
1. string在文件中的存储;
2.上述错误的原因,和解决方法?

分数不多,字数不少,望各位见谅,多多指教。



程序一

FILE * fp;

pair<string,int> myPair("appleappleappleappleappleappleappleappleappleappleapple",1);
printf("%d\n",sizeof(myPair));

if(fopen_s(&fp,"test.txt","wb")!=0)
{
printf("Open file error!\n");
exit(-1);
}
fwrite(&myPair,sizeof(pair<string,int>),1,fp);
fclose(fp);

myPair = make_pair("orange",1);

if(fopen_s(&fp,"test.txt","rb")!=0)
{
printf("Open file error!\n");
exit(-1);
}
fread(&myPair,sizeof(pair<string,int>),1,fp);
fclose(fp);


×××××××××××××××××××××××××××××××××××××××××××××××××××××××
程序二
FILE * fp;

pair<string,int> myPair("apple",1);
printf("%d\n",sizeof(myPair));

if(fopen_s(&fp,"test.txt","wb")!=0)
{
printf("Open file error!\n");
exit(-1);
}
fwrite(&myPair,sizeof(pair<string,int>),1,fp);
fclose(fp);

myPair = make_pair("orange",1);

if(fopen_s(&fp,"test.txt","rb")!=0)
{
printf("Open file error!\n");
exit(-1);
}
fread(&myPair,sizeof(pair<string,int>),1,fp);
fclose(fp); String 存储
------解决方案--------------------


更正一下,上面的程序,读二进制的部分效率低,重新写了一个



涉及到指针的对象都不能直接memcpy的,也不能直接读写进文件。

写的时候要把对象所管理的内容写进文件,而不是把对象直接写进文件。
读的时候也是读取内容,然后用对象的构造函数重新构造1个。不能直接读取对象。

读写数据,而不是读写地址。(读写指针就是读写地址)


[解决办法]
推荐阅读
《深度探索C++对象模型》
《C++反汇编与逆向分析技术揭秘》
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

热点排行