??xml version="1.0" encoding="utf-8" standalone="yes"?>合区精品久久久中文字幕一区,久久婷婷久久一区二区三区,欧美久久综合九色综合http://www.shnenglu.com/stdyh/category/1990.htmlvc java sdkzh-cnSun, 16 Dec 2012 06:44:57 GMTSun, 16 Dec 2012 06:44:57 GMT60C++异常ȝhttp://www.shnenglu.com/stdyh/archive/2012/11/30/195828.htmldyhdyhFri, 30 Nov 2012 07:58:00 GMThttp://www.shnenglu.com/stdyh/archive/2012/11/30/195828.htmlhttp://www.shnenglu.com/stdyh/comments/195828.htmlhttp://www.shnenglu.com/stdyh/archive/2012/11/30/195828.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/195828.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/195828.html1. 抛出的异常对象不应该是指针类?/div>
因ؓ指针指向的对象的删除和析构由谁来处理Q什么时候执行,都是无法定的事情,C++也没有定义,比如堆和栈上的对象的处理方式必然不一?br />
2. 不能昑ּ地把NULL作ؓ异常对象抛出
因ؓthrow(NULL)=tbrow(0)Q因此NULL会被当作整型捕获Q而不是空指针帔RQ这可能与程序员的预期不一?br />
3. 如果一个函数声明时指定了具体的异常cdQ那么它只能抛出指定cd的异?/div>
函数的代码结构如下:q回值类型函数名(形参?throw(cd名表){函数体}
int A() throw(myexception, int)  -- 只能抛出myexception和int两种cd的异?/div>
int A() throw()                  -- 不抛ZQ何异?/div>
int A()                          -- 可以抛出M异常Q也可以不抛出异?/div>
函数原型中的异常声明要与实现中的异常声明一_否则会引起异常冲H。由于异常机制是在运行出现异常时才发挥作用的Q因此如果函数的实现中抛Z没有在其异常声明列表中列出的异常Q编译器也许不能查出来。当抛出一个未在其异常声明列表里的异常cdӞunexpected()函数会被调用Q默认会Dstd::bad_exceptioncd的异常被抛出。如果std::bad_exception不在异常声明列表里,又会Dterminate()被调用,从而导致程序结?br />
4. 异常只能在初始化之后而且E序l束之前抛出
5. throw语句中的表达式本w不能引发新的异?br />
6. I的throw语句只能出现在catch语句块中
I的throw用来捕L异常再抛出,可以实现多个处理E序问异常的传递。然而,如果在catch语句外用Q由于没有捕获到异常Q也没有东西可以再抛出Q这样会DE序以不定的方式l止(q依赖具体的~译?
7. 典型的try-catchl构应该是派生派在最前面Q基cd后,最后是...
8. catch的处理顺序ؓ从上CQ只要找C个匹配的异常cdQ后面的异常处理都被忽略
9. 若异常对象ؓcȝ对象Ӟ应该通过引用来捕?/div>
若不是用引用Q则zcd象L会被截断成ؓ基类对象


dyh 2012-11-30 15:58 发表评论
]]>[转]用两个栈实现一个队列——我作ؓ面试官的结http://www.shnenglu.com/stdyh/archive/2012/11/16/195273.htmldyhdyhFri, 16 Nov 2012 08:12:00 GMThttp://www.shnenglu.com/stdyh/archive/2012/11/16/195273.htmlhttp://www.shnenglu.com/stdyh/comments/195273.htmlhttp://www.shnenglu.com/stdyh/archive/2012/11/16/195273.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/195273.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/195273.html

两年前从|上看到一道面试题Q用两个栈(StackQ实C个队列(QueueQ。觉得不错,q常拿来面试,几年下来Q做此题的应该有几十Z。通过寚w试者的表现和反应,有一些统计和感受Q在此做个小l?/span>

 

?/span>C++描述Q题目大致是q样的:

 

已知下面Stackcd?/span>3个方?/span>Push?/span>Pop?/span> CountQ请?/span>2?/span>Stack实现Queuecȝ入队(Enqueue)出队(Dequeue)Ҏ?/span>

 

class Stack

{

public:

         void Push(int x); // Push an element in stack;

         int Pop();  // Pop an element out of stack;

         int Count() const;     // Return the number of the elements in stack;

};

 

class Queue

{

public:

         void Enqueue(int x);

         int Dequeue();

 

private:

         Stack s1;

         Stack s2;

};

 

q道题应该不难Q比赗编E之》中微Y那些什?#8220;ȝ?#8221;的面试题Q难度上差远了。况且,׃旉关系Q我一般也不要求面试者写代码Q只描述清楚思\卛_。出q道题,主要考察3点:

 

1.       在短旉内,能不能找到解册道题的够清晰的思\Q思维是否敏捷、清晎ͼ?/span>

2.       能不能在单向表述中,清楚地描q自q思\和想法(表述能力是否辑ֈ要求Q?/span>

3.       对于某些具体l节Q能不能考虑刎ͼ是否_l致Q?/span>

 

M上,?/span>10Zؓ例,实际的结果大致是Q?/span>

 

1.       8个h可以扑ֈ解决{案Q?/span>2个h无法扑ֈ{案Q即使进行了必要的提C,曄有位L国MIT深?/span>2q_之后?/span>Google国公司工作q?/span>8个月的兄弟,也没做出来)?/span>

2.       8个找到答案的ZQ?/span>6个找到的Ҏ相同Q?/span>2个h扑ֈ其它变种?/span>

3.       在这8个h中,?/span>1个h可以不经提示Q同时想到大众方法和变种?/span>

 

大多Ch的思\是:始终l护s1作ؓ存储I间Q以s2作ؓ临时~冲区?/span>

入队Ӟ元素压?/span>s1?/span>

出队Ӟ?/span>s1的元素逐个“倒入”Q弹出ƈ压入Q?/span>s2Q将s2的顶元素弹出作ؓ出队元素Q之后再?/span>s2剩下的元素逐个“倒回”s1?/span>

见下面示意图Q?/span>

 

2Stacks1Queue

 

上述思\Q可行性毋庸置疑。但有一个细节是可以优化一下的。即Q在出队Ӟ?/span>s1的元素逐个“倒入”s2Ӟ原在s1栈底的元素,不用“倒入”s2Q即?#8220;?#8221;s1.Count()-1个)Q可直接弹出作ؓ出队元素q回。这样可以减一ơ压栈的操作。约有一半hQ经提示后能意识到此问题?/span>

 

上述思\Q有些变U,如:

入队Ӟ先判?/span>s1是否为空Q如不ؓI,说明所有元素都?/span>s1Q此时将入队元素直接压入s1Q如为空Q要?/span>s2的元素逐个“倒回”s1Q再压入入队元素?/span>

出队Ӟ先判?/span>s2是否为空Q如不ؓI,直接弹出s2的顶元素q出队;如ؓI,?/span>s1的元素逐个“倒入”s2Q把最后一个元素弹出ƈ出队?/span>

有些同时惛_大众Ҏ和变U,应该说头脑还是比较灵光的?/span>

 

相对于第一U方法,变种?/span>s2好像比较“?#8221;Q每ơ出队后Qƈ不将元素“倒回”s1Q如果赶上下ơ还是出队操作,效率会高一些,但下ơ如果是入队操作Q效率不如第一U方法。我有时会让面试者分析比较不同方法的性能。我感觉Q没做深入研IӞQ入队、出队操作随机分布时Q上qCU方法M上时间复杂度和空间复杂度应该相差无几Q无非多个少个判断)?/span>

 

真正性能较高的,其实是另一个变U。即Q?/span>

入队Ӟ元素压?/span>s1?/span>

出队Ӟ判断s2是否为空Q如不ؓI,则直接弹出顶元素Q如为空Q则?/span>s1的元素逐个“倒入”s2Q把最后一个元素弹出ƈ出队?/span>

q个思\Q避免了反复“?#8221;栈,仅在需要时?#8220;?#8221;一ơ。但在实际面试中很少有h说出Q可能是旉较少的缘故吧?/span>

 

以上几个思\乍看没什么问题了Q但其实q是有个l节要考虑的。其实无Z么方法和情况Q都要考虑没有元素可供出队时的处理Q?/span>2个栈都ؓI的时候,出队操作一定会引v异常Q。在实际写代码时Q忽略这些判断或异常处理Q程序会出现问题。所以,能不能考虑到这些细节,也体C个h的素充R?/span>

 

个h感觉Q这道题实有助于我鉴别应聘的h。但对于面试Q毕竟还是要看面试者的l合素质Q一道(或几道)题定生死不可取?/span>



dyh 2012-11-16 16:12 发表评论
]]>
C++ Fragmenthttp://www.shnenglu.com/stdyh/archive/2012/11/05/194562.htmldyhdyhMon, 05 Nov 2012 08:37:00 GMThttp://www.shnenglu.com/stdyh/archive/2012/11/05/194562.htmlhttp://www.shnenglu.com/stdyh/comments/194562.htmlhttp://www.shnenglu.com/stdyh/archive/2012/11/05/194562.html#Feedback0http://www.shnenglu.com/stdyh/comments/commentRss/194562.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/194562.html1. 模板cȝ定义和实现必L在同一个头文g?br />
2. unary_function和binary_function是stl提供的一元和二元函数对象基类Q子c需实现()操作W,q样的子cd以用在stl法函数中,如sort, partition{?div>   一元函数对象例子如下:
template <typename T> 
class FilterCriterion : public unary_function<T, bool>
{

public:
    bool operator()(const T& val) const
    {
        return (val.size() > 0);
    };

};

FilterCriterion<MyType> f;
partition(vec.begin(), vec.end(), f); //对MyType对象q行分类Qsize必须>0)
   二元函数对象例子如下Q?/div>
template <class T> 
class RankCriterion : public binary_function<T, T, bool>
{
public:
bool operator()(const T& lhs, const T& rhs) const
{
return (lhs.size() > rhs.size());
};
}
RankCriterion<MyType> r;
sort(vec.begin(), vec.begin(), vec.end(), r); // 对MyType对象q行排序(按size大小排序Q?/div>
3. C++处理表达式可以采用先转成逆L兰表辑ּQ然后计?br />http://www.cnblogs.com/adamxx/archive/2006/08/30/703267.html

4. Dll导出cL函数
#ifdef SIMPLEDLL_EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

5. const 成员函数
const 成员函数获得的能力:可以操作帔R对象Q如GetName函数定义为string GetName() const; 那么Const A a; a.GetName();是能~译通过的,若GetName不定义ؓconstQ那么上q调用编译会p|

const成员函数失去的能力:有得必有失,不能修改cȝ数据成员Q不能在函数中调用其他非const的函?/span>

dyh 2012-11-05 16:37 发表评论
]]>[转]C++开源跨q_cd?/title><link>http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html</link><dc:creator>dyh</dc:creator><author>dyh</author><pubDate>Fri, 27 Apr 2007 12:48:00 GMT</pubDate><guid>http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html</guid><wfw:comment>http://www.shnenglu.com/stdyh/comments/23064.html</wfw:comment><comments>http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/stdyh/comments/commentRss/23064.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/stdyh/services/trackbacks/23064.html</trackback:ping><description><![CDATA[     摘要: l典的C++?<br> STLport-------SGI STL库的跨^台可UL版本Q在以前有些~译器离W合 <br> 标准比较q的情况?那时q是有用的,当然目前vc71已经比较接近标准了, <br> 故目前不怎么用它了?<br> Boost---------准标准库Q?功能强大 涉及能想的到的大部分非特别领域的法Q?<br> 有一个大的C++C֌支持 <br> WxWindows-----功能强大的跨q_GUI? Q它的功能和l构都类?MFCQ故原则?<br> 可以通过WxWindows把现有MFCE序UL到非Winq_?<br> Blitz---------高效率的数D函数库 ,你可以订制补充你需要的法 <br> Log4cpp-------日志处理 Q功能类似java中的log4j <br> ACE-----------自适应通讯环境Q?重量U的通讯环境库?<br> Crypto++ -----?解密法? 非常专业的C++ 密码学函式库 <br> CppUnit --- 一?nbsp; <a href='http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html'>阅读全文</a><img src ="http://www.shnenglu.com/stdyh/aggbug/23064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/stdyh/" target="_blank">dyh</a> 2007-04-27 20:48 <a href="http://www.shnenglu.com/stdyh/archive/2007/04/27/23064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++对象内存布局(转蝲)http://www.shnenglu.com/stdyh/archive/2007/01/08/17442.htmldyhdyhMon, 08 Jan 2007 13:17:00 GMThttp://www.shnenglu.com/stdyh/archive/2007/01/08/17442.htmlhttp://www.shnenglu.com/stdyh/comments/17442.htmlhttp://www.shnenglu.com/stdyh/archive/2007/01/08/17442.html#Feedback1http://www.shnenglu.com/stdyh/comments/commentRss/17442.htmlhttp://www.shnenglu.com/stdyh/services/trackbacks/17442.html  先问一个问?两个不同cd的指针相互{换以?他们在数g是一L?比如:

    int nValue = 10;
    int *pInt = &nValue;
    void *pVoid = pInt;
    char *pChar = (char*)pInt;


  q些指针的?不是说指针指向的内存的内?是一L? 如果你的回答?yes,那如果是一个类的承体pd?在承类向基c{换的q程?指针的数D是不变化的么?如果你的回答?不一定会变化,要看cȝ体系是怎么设计?的话,那恭喜你,不用看下M.如果你还不确定究竟变q是不变,I竟哪些?哪些不变,I竟Z么要变ؓ什么不变的?接着看下?

  c++ 标准不规?c++ 实现的时候的对象的具体的内存布局,除了在某些方面有的限制以外,c++ 对象在内存里面的布局完全是由~译器自行决?q里我也只是讨论 vc++ .net 2003 build 7.1.3091 的实现方?我ƈ没有?vc5 vc6 vc.net 2002 以及其他?2003 build 上面做过试,l论也许不适合那些~译q_.q些属于~译器具体实?ms 保留有在不通知你我的情况下作出更改的权?废话q么?马上开?

  对于 c 的内建指针的转换,l果是不用多讨论?我们只是讨论 c++ 的对?从最单的开?

    class CBase
    {
    public:
      int m_nBaseValue;
    };


  q样的一个类在内存里攄是非常简单的,他占??bytes 的空?不用多说,我们从他z一个类出来.

    class CDerive1 : public CBase
    {
    public:
      int m_nDerive1Value;
    };


  CDerive1 的对象在内存里面是怎么攄? 也很?占有8?bytes 的空???bytes 属于 CBase c?后四?bytes 属于自己.一个CDerive1 的指针{换成一?CBase 的指?l果是一L.下面我们加上多重l承看看.

    class CFinal : public CDerive,public CBase // q里?CDerive 是一个和 CBase 差不多的基类
    {
    public:
      int m_nFinalValue;
    };


  CFinal 的对象在内存里面的布局E微复杂一?但是也很Ҏ惌,他占?12 ?bytes 的空??个属?CDerive,中间4个属?CBase,后面4个才是自q.那一?CFinal 的指针{换成一?CDerive 指针,数g变么? 转换成一?CBase 指针?又会变化?{案?前一个不?后一个要变化,道理非常的明?CFinal 对象的开头刚好是一?CDerive 对象,?CBase 对象却在 CFinal 对象的中?自然是要变化的了,具体怎么变化? ?4 ?ok(自然要检查是否是I指?.

    CBase *pBase = pFinal ? (CBase*)((char*)pFinal + sizeof(CDerive)) : 0;// 当你写下 pBase = pFinal 的时?其实是这L

  q种不带 virtual 的承就q么?只是加上一?offset 而已.下面我们看看如果加上 virtual function 的时候是什么样子的?
q是从简单类开?

    class CBase
    {
    public:
      virtual void VirtualBaseFunction(){}
      int m_nBaseValue;
    };


  q里L没有使用 virtual destructor,因ؓq个函数E微有些不同.q是同样的问?CBase cd内存上占多大的空?q是 4 bytes ? {案?no, 在我的编译器上面?8 bytes,多出来的 4 bytes ?__vfptr(watch H口看见的名?,他是一个指?指向了类?vtable,那什么是 vtable ?他是用来q什么的? vtable 是用来支?virtual function 机制?他其实是一个函数指针数l?q不{同于c/c++语言里面的指针数l?因ؓ他们的类型ƈ不一定是一L.)他的每一个元素都指向了一个你定义?virtual function,q样通过一个中间层来到辑֊态连~的效果,q些指针是在E序q行的时候准备妥当的,而不是在~译的时候准备妥当的,q个是动态联~的目的,具体是由谁来讄q些指针的呢?constructor/destructor/copy constructor/assignment operator他们完成?不用奇?~译器会在你写的q些函数里面安插些必要的代码用来讄 vtable 的?如果你没有写q些函数,~译器会在适当的时候帮你生成这些函?明白一? vtable 是用来支?virtual function 机制?而需?virtual 机制的类基本上都会由一?__vfptr 指向他自q vtable.在调?virtual function的时?~译器这样完?

   pBase->VirtualBaseFunction(); => pBase->__vfptr[0]();// 0 是你的virtual function ?vtable 中的 slot number,~译器决?/font>

  现在应该很想?CBase 的大了?那这?__vfptr 是放C么位|的? ?m_nBaseValue 之前q是之后? 在我的编译器上看?是在之前,Z么要攑ֈ之前,是因为在通过 指向cL员函数的指针调用 virtual function 的时候能些代码(指汇~代?,q个原因q里׃深入讨论?有兴的同学可以看看 inside the c++ object model 一?
  接下?我们加上l承来看?

    class CDerive1 : public CBase
    {
    public:
      virtual void VirtualDerive1Function();
    };


  q个时候你也许要说,内存布局跟没?virtual 是一L,只不q每个类多了一?__vfptr 而已,?..q个是不对的,在我的编译器上面 两个cd享同一?__vfptr, vtable 里面放有两个指针,一个是两个cd享的,一个只属于 CDerive1 c?调用的时候如何呢?

   pDerive1->VirtualDerive1Function() => pDerive1->__vfptr[1]();
   pDerive1->VirtualBaseFunction() => pDerive1->__vfptr[0]();


  至于指针的相互{?数D是没有变化的(也正是追求这U效?所以把 __vfptr 攑ֈcȝ开?因ؓ调整 this 指针也是要占有运行时的时间的).

  现在加上多重l承瞧瞧,代码我不写上来了,p上面?CFinal, CDerive, CBase 体系一?只是每个cd一个VirtualxxxFunction出来,q个时候的指针调整q是没有什么变?所以我们只是看?vtable 的情?你会?CDerive ?CFinal ׃n一?__vfptr,?CBase 有一个自q __vfptr,?CFinal ?__vfptr ?2 个slot,q个l论是正的. 同时你也会说 通过 CFinal c调?CBase 的函数是要进行指针调整的,yes you'r right,不仅仅是 this 指针调整(?this 指针会成?function 的一个参?,q要调整 vtable 的?

   pFinal->VirtualBaseFunction() => (CBase*)((char*)pFinal + sizeof(CDerive))->__vfptr[0]();

   转换?asm 的代码大U是q样?

   mov eax,[pFinal] ; pFinal is a local object,pFinal will be epb - xx
   add eax,8 ; 8 = sizeof(CDerive)
   mov ecx,eax ; ecx is this pointer
   mov edx,[eax] ; edx = vtable address
   call [edx] ; call vtable[0]


  写到q里也就明白this指针是怎么调整??virtual function 的承也不复?this指针调整也是很简单的,下面看最复杂的部?virtual inheritance.

  我的~译器支持虚拟承的方式和虚函数的方式差不多,都是通过一?table 完成,只是q个q不到 vc 赋予的名字了,我们叫他 vbtable ?~译器同样在c里面加入一个指?vbtable 的指?我们叫他 __vbptr ?q个指针指向?vbtable ,?vbtable 里面的每一对应了一个基c?vbtable 记录了每个基cȝ某一个偏U量,通过q个偏移量就能计出具体cȝ指针的位|?看个单的例子:

   class CBase
   {
   public:
     virtual ~CBase(){}
   };

   class CMid1 : public virtual CBase
   {
   public:
     virtual ~CMid1(){}
     int m_nMid1;
   };

   class CMid2 : public virtual CBase
   {
   public:
     virtual ~CMid2(){}
     int m_nMid2;
   };

   class CFinal : public CMid1,public CMid2
   {
   public:
     virtual ~CFinal(){}
     int m_nFinal;
   };

   CFinal final;
   CFinal *pFinal = &final;    // pFinal = 0x0012feb4;
   CBase *pBase = pFinal; // pBase = 0x0012fec8 = pFinal + 0x14;
   CMid1 *pMid1 = pFinal; // pMid1 = 0x0012feb4 = pFinal;
   CMid2 *pMid2 = pFinal; // pMid2 = 0x004210b4 = pFinal;


  l果让你吃惊? 最奇怪的地方居然?CMid2 ?CMid1 的地址居然是一L,q个是因?vc ?vbtable 攑ֈ?CFinal cȝ开头的原因,而CMid1 ?CMid2 也同栯使用q个 vbtable, 所?q个三个的地址也就必须相同??CBase 的地址是怎么出来的呢? ?..刚刚我们说了 vbtable 攑ֈ了CFinal 的开?vc 一定会攑֜开头吗?{案是不一?q个E后解释).在我的机器上?final 对应内存的第一?dword ?0x00426030,查看q个地址,W一个dword ?0 ,W二个就?0x14,刚好?pBase 的偏Uȝ?q个只是巧合,也许你换个类的承体pd完全不同?但是我只是想说明一?基类的偏U计是?vbtable 的值相兌?下面我们来看看 vc 是怎么计算q些偏移?
  vc 在分析我们的代码的时?生成了一份类的承体pM?其中有一个叫 thisDisplacement 的_PMDl构:

    struct _PMD // total undocumented
    {
      int mdisp; // i think the meaning is Multiinheritance DISPlacement
      int pdisp; // Pointer to vbtable DISPlacement
      int vdisp; // Vbtable DISPlacement
    };


  l构的名字和成员变量的名字确实实是 vc 的名??watch H口输入 (_PMD*)0 p看到q个l构的详l信?,每个字段的含义却是我自己猜测出来?mdisp 大概用来表示多重l承(包括单一l承)的时候的偏移?pdisp 表示 vbtable 的偏U量,?vdisp 表示cd vbtable 里面的下?那么有了q个l构怎样才能完成指针的{换呢?假如我们有一个派生类指针 pFinal,要{换成一个特定的基础c?我们首先要知道和q个基类对应?_PMD l构的信?q个信息的获?我暂时没有找C个非常方便的Ҏ,现在我用的Ҏ下面会有描述),有了q个信息以后,转换方便了.首先扑ֈ vbtabel 的地址 *(pFinal + pdisp),然后扑ֈ基类的偏U?*(*(pFinal + pdisp) + vdisp) q个偏移值是相对vbtable?所以还要加?vbtable的偏U?最后加?mdisp的偏U?如下:

  char *pFinal = xxx; // need a init value
  char *pBase; // we must calc
  pBase = pFinal + mdisp + *(int *)(*(int *)(pFinal + pdisp) + vdisp) + pdisp;


  注意: ?pdisp < 0 的时候就表示q个cL?vbtable 直接使用 pFinal + mdisp 得到结果了.
  所以这个结构是一个通用的结?专门用作cd转换,不管是有无虚l承都能使用q个l构q行cd转换.

  通过q个l构,我们也能看到 vc 是怎样布局q个 object ?

  看到q里,也许你要大呼一口气,妈妈呀,一个类型{换要q么的麻烦吗?我直接写 pBase = pFinal 不就可以了吗? 恭喜你还没有被我忽悠得晕头{?哈哈.其实你写下那行语句的时?~译器在帮你做这个{?大约生成下面的代?br />
    mov eax,[pFinal] ;final address
    mov ecx,[eax] ; vbtable address *(int *)(pFinal + pdisp)
    mov edx,eax ; save to edx
    add edx,[ecx + 4] ; ecx + 4 is (*(int *)(pFinal + pdisp) + vdisp)
    mov [pBase],edx ; edx = pFinal + mdisp + *(int *)(*(int *)(pFinal + pdisp) + vdisp) + pdisp;
    ; here mdisp = 0, pdisp = 0, vdisp = 4


  也许你要说了,我要q些东西来干什?要{换的时候直接{换就好了,~译器会帮做,的确,大多数的时候确实是q样,但是,在某些时候却q不如此,现在你要实现一个功?输入一个指?输入一?_PMD l构,你要实现一个AdjustPointer 的函数来生成另一个指?q个时候你也只能这样完成了,因ؓ我没有给你两个指针的名字,ql了你字W串形式的名字也没有??...你也怼?办法是有?的确是有,模板p实现q种功能,?.q个我们暂时不讨论具体的实现l节.也许你要问了,I竟什么时候会d现这U听都没有听q的功能,其实q个函数是真正存在的,只不q不是由你来实现?而是 ms 的h实现?你只用写一?带有 c++ 异常的程?使用 ida 反汇~?然后查找函数,p扑ֈq个函数?他用来在异常处理时创?catch 所需要的 object.至于q个详细的信?h?我会最快速度写出关于 vc 是怎样实现 c++ 异常的文章来.

  最后了,说说那个 _PMD l构的获取方?看的时候不要吃?Ҏ比较的麻?比如我想知道?CFinal cȝ关的 _PMD 信息,先新建工?写下 throw pFinal q样的语?~译,在这个语句的地方讄断点,q行,转到反汇~?q入 __CxxThrowException@8 函数,q个时候不出意外你能看C个叫 pThrowInfo 的东?如果看不?h开"昄W号?选项),?watch H口里面输入pThrowInfo,展开?看到一个pCatchableTypeArray,记录下他?nCacthableTypes的?然后?watch 里面输入
pThrowInfo->pCatchableTypeArray->arrayOfCatchableTypes[0] ?pThrowInfo->pCatchableTypeArray->arrayOfCatchableTypes[n], n 是你刚刚记录的值减1,再展开他们,你就能看C?thisDisplacement 的数?l箋展开是 mdisp {等?很是ȝ??.你已l猜C,q个是和异常有关pȝ.

  后记: q段旉,我一直在M反汇~之后的代码,也颇有些心得,所以才有想法写一些文?探讨 vc ~译器鲜Zh?太过狂妄?的秘?q个斚w的文章也有h写过,那些文章也给我不的启发,我不认ؓ自己是第一个发现这些秘密的?但是臛_我自q道的,我是W一个把q些东西写出来的?文章里面作墨多的部分都是自己发现?p个文章里面的内容来说,inside the c++ object model 是有比较详细的描?但是他ƈ不是转换针对 vc q个~译器的实现,?_PMD q个l构我也没有在什么地方见有h描述q?只是?windows develop network ?002q?2月的杂志上看有h提到q这个结?可惜他却没有了解(臛_他在他发表文章的时候是如是说的)q个l构的用?正是因ؓq个原因,我才有写q个文章以及后箋文章的冲?.所?q个文章也算是我自己的原创吧.q个文g虽然和游戏制造没有太大的关系,但是?T 自视清高,不愿意自q文章被一帮不懂的h评hȝ,所以也没有发到那些著名?xxx |站,只发 goldpoint.转蝲h明出??T 对自qW一个原创文章比较珍?比较重视,谢谢).


dyh 2007-01-08 21:17 发表评论
]]>
文g操作eof()的问?/title><link>http://www.shnenglu.com/stdyh/archive/2006/06/21/8794.html</link><dc:creator>dyh</dc:creator><author>dyh</author><pubDate>Wed, 21 Jun 2006 13:10:00 GMT</pubDate><guid>http://www.shnenglu.com/stdyh/archive/2006/06/21/8794.html</guid><wfw:comment>http://www.shnenglu.com/stdyh/comments/8794.html</wfw:comment><comments>http://www.shnenglu.com/stdyh/archive/2006/06/21/8794.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/stdyh/comments/commentRss/8794.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/stdyh/services/trackbacks/8794.html</trackback:ping><description><![CDATA[大家在用C++写操作文件的E序?一定用过eof()q个函数,用它来判别文件结?但有不少也用来判别文件是否ؓI的.但是,q样操作的结果不是我们所想的.看下面程?<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br /><img id="Codehighlighter1_52_280_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_280_Open_Text.style.display='none'; Codehighlighter1_52_280_Closed_Image.style.display='inline'; Codehighlighter1_52_280_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_52_280_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_280_Closed_Text.style.display='none'; Codehighlighter1_52_280_Open_Image.style.display='inline'; Codehighlighter1_52_280_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_52_280_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_52_280_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> c </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    ifstream FILE(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (FILE.eof())<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文g是空?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;exit(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">); <br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">FILE.eof())<br /><img id="Codehighlighter1_193_239_Open_Image" onclick="this.style.display='none'; Codehighlighter1_193_239_Open_Text.style.display='none'; Codehighlighter1_193_239_Closed_Image.style.display='inline'; Codehighlighter1_193_239_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_193_239_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_239_Closed_Text.style.display='none'; Codehighlighter1_193_239_Open_Image.style.display='inline'; Codehighlighter1_193_239_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_193_239_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_193_239_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        FILE.</span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">(c);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> c;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">    <br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>当test.txt为空文g?它输出的?c<br />奇?应该输出?文g是空? while里面的操作也应该不用到的.但是l果偏偏和我们所想的相反.<br />?那操作二q制文g又是怎样的呢?修改下ؓ:<br />   </p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> ifstream FILE(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,ios::</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">ios::binary);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (FILE.eof())<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />        cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文g是空?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">FILE.eof())<br /><img id="Codehighlighter1_121_171_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_171_Open_Text.style.display='none'; Codehighlighter1_121_171_Closed_Image.style.display='inline'; Codehighlighter1_121_171_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_121_171_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_121_171_Closed_Text.style.display='none'; Codehighlighter1_121_171_Open_Image.style.display='inline'; Codehighlighter1_121_171_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_121_171_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_121_171_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        FILE.read(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">c,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> c;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">代码其他部分相同<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>l果输出q是c..?!怎么会这L.分明是骗人的东西?!到底是什么原因呢?<br />     l过一D늠I后,原来eof()q回true的条件是"d文gl束W?Q而不是文件内容的最后一个字W?br />要清?文gl束W?(0xff).是说我们文件最后的字符不是文gl束W?而最后的字符的下一位才?所以操作再d一?׃ؓ什么上面if (FILE.eof())Lfalse? 在一些编译器?dev c++),它读到最后一个字W后文g位置的指针会定在那儿,所以就会重复最后一个字W?     <br />    在一个外国的CPP论坛见到一位同志的代码刚好有这解决Ҏ.现在把上面的代码改ؓ下面?</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">fstream.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br /><img id="Codehighlighter1_75_355_Open_Image" onclick="this.style.display='none'; Codehighlighter1_75_355_Open_Text.style.display='none'; Codehighlighter1_75_355_Closed_Image.style.display='inline'; Codehighlighter1_75_355_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_75_355_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_355_Closed_Text.style.display='none'; Codehighlighter1_75_355_Open_Image.style.display='inline'; Codehighlighter1_75_355_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_75_355_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_75_355_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> c </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    ifstream FILE(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (FILE.peek() </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> EOF)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改 </span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_163_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_220_Open_Text.style.display='none'; Codehighlighter1_163_220_Closed_Image.style.display='inline'; Codehighlighter1_163_220_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_163_220_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_220_Closed_Text.style.display='none'; Codehighlighter1_163_220_Open_Image.style.display='inline'; Codehighlighter1_163_220_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span id="Codehighlighter1_163_220_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_163_220_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文g是空?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl; <br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        exit(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">       <br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (FILE.peek() </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> EOF)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">修改</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_268_314_Open_Image" onclick="this.style.display='none'; Codehighlighter1_268_314_Open_Text.style.display='none'; Codehighlighter1_268_314_Closed_Image.style.display='inline'; Codehighlighter1_268_314_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_268_314_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_268_314_Closed_Text.style.display='none'; Codehighlighter1_268_314_Open_Image.style.display='inline'; Codehighlighter1_268_314_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span id="Codehighlighter1_268_314_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/images/dot.gif" /></span><span id="Codehighlighter1_268_314_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        FILE.</span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">(c);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />        cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> c;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">    <br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>主要的是把eof()改ؓpeek() == EOF来判?其中peek()是取文g当前指针,EOF是文件尾标符,它的gؓ-1.所以采用这U方法就解决上面eof()的问题了..q种Ҏ也可以用在读写二q制文g?</p><img src ="http://www.shnenglu.com/stdyh/aggbug/8794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/stdyh/" target="_blank">dyh</a> 2006-06-21 21:10 <a href="http://www.shnenglu.com/stdyh/archive/2006/06/21/8794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.aystone.cn" target="_blank">AVպƷþþþþþ</a>| <a href="http://www.b24193.cn" target="_blank">޹˾þһþ</a>| <a href="http://www.tjywmc.cn" target="_blank">þseƷһƷ</a>| <a href="http://www.tingyuxuan999.cn" target="_blank">Ʒѿþþ</a>| <a href="http://www.liuqianqian.cn" target="_blank">ƷžžþƵ</a>| <a href="http://www.puhb.cn" target="_blank">þۺϳDž </a>| <a href="http://www.wxwyx.cn" target="_blank">99þþƷۺһ</a>| <a href="http://www.52shadu.cn" target="_blank">þþþùƷ۲ӰԺ</a>| <a href="http://www.pianjuan.cn" target="_blank">Ʒ99þþþþ鶹</a>| <a href="http://www.hbqw.net.cn" target="_blank">˾þô߽槼</a>| <a href="http://www.grandfreshop.cn" target="_blank">޹СƵƷþþ</a>| <a href="http://www.kpqo.cn" target="_blank">aaaƷþþùƬ</a>| <a href="http://www.231it.cn" target="_blank">AþþƷ</a>| <a href="http://www.u6768.cn" target="_blank">þþ</a>| <a href="http://www.ersunle.cn" target="_blank">þۺϸϾþúݺݺ97ɫ69 </a>| <a href="http://www.honglinzhiyi.cn" target="_blank">þþƷ˘AV</a>| <a href="http://www.yweishang.cn" target="_blank">þþþƵ</a>| <a href="http://www.goqswequrv.cn" target="_blank">þþƷһ</a>| <a href="http://www.lntyyp.cn" target="_blank">˼˼þ99ֻƵƷ66</a>| <a href="http://www.csafebox.cn" target="_blank">ۺϾƷþ</a>| <a href="http://www.4fp5r8p.cn" target="_blank">97þþþ޾Ʒר</a>| <a href="http://www.ujpy.cn" target="_blank">ĻþþƷ1</a>| <a href="http://www.4fro.cn" target="_blank">þþþƷþþþþ</a>| <a href="http://www.ruan8.cn" target="_blank">˾Ʒһþþ</a>| <a href="http://www.4fp5r8p.cn" target="_blank">91Ʒ9lþþþ</a>| <a href="http://www.qpzv.cn" target="_blank">޾ƷþרӰҵ</a>| <a href="http://www.sspfn.cn" target="_blank">þþþþϸApp</a>| <a href="http://www.hejz.cn" target="_blank">ղþǿѵĿ</a>| <a href="http://www.obsessions.cn" target="_blank">þþþùɫAVѿͼƬ</a>| <a href="http://www.dgabs.cn" target="_blank">Ʒþþþþþö</a>| <a href="http://www.yayalove.cn" target="_blank">91Ʒ91þ</a>| <a href="http://www.jtm0513.cn" target="_blank">ھƷþþþþòӰԺ</a>| <a href="http://www.vf369.cn" target="_blank">99þþƷѹƬ</a>| <a href="http://www.bqb2.cn" target="_blank">þۺۺϾþúݺݺ97ɫ88</a>| <a href="http://www.jrsddk.cn" target="_blank">72ŷþþþôƽ</a>| <a href="http://www.buniaowan.cn" target="_blank">þþþһƷɫ</a>| <a href="http://www.enld.cn" target="_blank">Ʒþ8xѹۿ</a>| <a href="http://www.fanggumen.cn" target="_blank">žžþ99ۺһ</a>| <a href="http://www.seowiki.com.cn" target="_blank">þþþƷһ</a>| <a href="http://www.qunfazongzhan.cn" target="_blank">þ99Ʒһ</a>| <a href="http://www.meelin.cn" target="_blank">ũ帾ŮëƬƷþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>