文件流问题
ifstream is("floor\\floorinfo.flr");
if(is)
{
is.read((char *)&m_nFloorCount,sizeof(m_nFloorCount));
//这句不太明白
for(int i=0;i<3;i++)
is.read((char *)&m_FloorStruct[i],sizeof(m_FloorStruct[i]));
}
else{
MessageBox(NULL,"无法打开地块文件","error",0);
return false;
}
/////////////////////////////////////////////////////////////////////////////////
CFloor::CFloor(void)
{
m_nFloorCount=0;
}
问题点数:100、回复次数:6Top
1 楼junguo(junguo)回复于 2005-09-13 08:58:53 得分 20
就是读出文件中的一个数字。因为你要打开的文字中,保存一个数字,可能用它来记录保存到文件中的
struct总量,所以首先把它读出来。Top
2 楼zhouhuahai(道号"虚无")回复于 2005-09-13 09:16:03 得分 70
首先,fstream是basic_fstream模板类关于char的一个实例。
typedef basic_fstream<char, char_traits<char> > fstream;
basic_fstream的由basic_iostream派生的
template <class Elem, class Tr = char_traits<Elem> > class basic_fstream : public basic_iostream<Elem, Tr>
basic_iostream是由basic_istream和basic_ostream派生的。
template <class Elem, class Tr = char_traits<Elem> > class basic_iostream : public basic_istream<Elem, Tr>, public basic_ostream<Elem, Tr>
我们使用的fstream::read实际上是 basic_istream::read().
basic_istremm& read(E *s, streamsize n);
而basic_istream是从basic_ios派生的
template <class Elem, class Tr = char_traits<Elem> > class basic_istream : virtual public basic_ios<Elem, Tr>
basic_ios是从ios_base派生的
template <class Elem, class Traits> class basic_ios : public ios_base
在流的实现上,采取了缓冲区I/O的方式,每个stream对象中都有一个对于一个streambuf,对于流的操作缺省状态下是对于缓冲区的操作,直到出现迫使他和缓冲区同步的操作。
read()使用了同步缓冲区,read()读取的时候,如果发现缓冲区中的数据不够,就试图从关联的数据源(这里就是文件)来读取。Top
3 楼zhouhuahai(道号"虚无")回复于 2005-09-13 09:19:43 得分 0
read()函数,它的原型被定义如下:
read( char* addr, streamsize size )
read()从输入流中提取size个连续的字节,并将其放在地址从addr开始的内存中。gcount()返回由最后一个read()调用提取的字节数。read()返回当前被调用的istream类对象。
is.read((char *)&m_nFloorCount,sizeof(m_nFloorCount));
这里的意思就是从输入流中提取sizeof(m_nFloorCount)个连续的字节,并将其放在地址从m_nFloorCount开始的内存中.Top
4 楼zhouhuahai(道号"虚无")回复于 2005-09-13 09:20:16 得分 0
偶讲得很清楚了吧,几乎把整个流都说了出来了.呵呵..............Top
5 楼jiajun2001(Jagen(嘉俊))回复于 2005-09-13 09:25:31 得分 10
呵呵,佩服一下楼上的,真是热心阿。哈。
简单一点,就是读取一个整数。Top
6 楼xxqqhh_nn(shuibian)回复于 2005-09-13 10:13:16 得分 0
ifstream is("floor\\floorinfo.flr");
if(is)
{
is.read((char *)&m_nFloorCount,sizeof(m_nFloorCount));
for(int i=0;i<m_nFloorCount;i++)//这里有修改
is.read((char *)&m_FloorStruct[i],sizeof(m_FloorStruct[i]));
}
else{
MessageBox(NULL,"无法打开地块文件","error",0);
return false;
}
我知道了,原来他的程序有不严谨的地方.原来的for(int i=0;i<3;i++)应该为for(int i=0;i<m_nFloorCount;i++).我本来就不知道文件里的内容是什么.谢谢大家Top




