??xml version="1.0" encoding="utf-8" standalone="yes"?>色综合久久综合中文综合网,亚洲精品乱码久久久久久蜜桃不卡 ,久久综合视频网http://www.shnenglu.com/liu1061/category/5732.html生活和工作都要充满激?否则你无法体会到淋漓致的快乐与痛苦zh-cnFri, 29 Aug 2008 03:22:32 GMTFri, 29 Aug 2008 03:22:32 GMT60ȝ自己写程序时的变量,函数命名风格Q?/title><link>http://www.shnenglu.com/liu1061/articles/60311.html</link><dc:creator>T.S Liu</dc:creator><author>T.S Liu</author><pubDate>Thu, 28 Aug 2008 16:25:00 GMT</pubDate><guid>http://www.shnenglu.com/liu1061/articles/60311.html</guid><wfw:comment>http://www.shnenglu.com/liu1061/comments/60311.html</wfw:comment><comments>http://www.shnenglu.com/liu1061/articles/60311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/liu1061/comments/commentRss/60311.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/liu1061/services/trackbacks/60311.html</trackback:ping><description><![CDATA[<p><br>ȝ自己写程序时的变量,函数命名风格Q?br>                                                                                                         example :<br><span style="FONT-FAMILY: courier new">pointer --> p_+varname;                   int *p_ivalue = NULL; <br>typedef --> t_+typenam;                   typedef struct name t_name<br>globle variable --> g_+typevarname        int g_ivalue  = 0;<br>member variable --> m_+typevarname        int m_ivalue  = 0;<br>static variable --> s_+typevarname        static int s_ivalue = 0;<br>temp variable   --> typevarname           int ivalue = 0;<br>string varable  --> str_varname           string str_name;<br>const string varalbe --> cstr_varname     const string cstr_name</span></p> <p style="FONT-FAMILY: courier new"><br>function style :<br>extern int name_name_name(type var_name,...)</p> <img src ="http://www.shnenglu.com/liu1061/aggbug/60311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/liu1061/" target="_blank">T.S Liu</a> 2008-08-29 00:25 <a href="http://www.shnenglu.com/liu1061/articles/60311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C常用宏定义!Q!http://www.shnenglu.com/liu1061/articles/54896.htmlT.S LiuT.S LiuSun, 29 Jun 2008 02:06:00 GMThttp://www.shnenglu.com/liu1061/articles/54896.htmlhttp://www.shnenglu.com/liu1061/comments/54896.htmlhttp://www.shnenglu.com/liu1061/articles/54896.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/54896.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/54896.html01: 防止一个头文g被重复包?br>#ifndef COMDEF_H
#define COMDEF_H
//头文件内?br>#endif
02: 重新定义一些类?防止׃各种q_和编译器的不?而生的cd字节数差?方便UL?br>typedef  unsigned char      boolean;     /* Boolean value type. */
typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */
typedef  unsigned short     uint16;      /* Unsigned 16 bit value */
typedef  unsigned char      uint8;       /* Unsigned 8  bit value */
typedef  signed long int    int32;       /* Signed 32 bit value */
typedef  signed short       int16;       /* Signed 16 bit value */
typedef  signed char        int8;        /* Signed 8  bit value */

//下面的不使用
typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */
typedef  unsigned short    word;         /* Unsinged 16 bit value type. */
typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */
typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */
typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */
typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */
typedef  signed char       int1;         /* Signed 8  bit value type. */
typedef  signed short      int2;         /* Signed 16 bit value type. */
typedef  long int          int4;         /* Signed 32 bit value type. */
typedef  signed long       sint31;       /* Signed 32 bit value */
typedef  signed short      sint15;       /* Signed 16 bit value */
typedef  signed char       sint7;        /* Signed 8  bit value */

03: 得到指定地址上的一个字节或?br>#define  MEM_B(x) (*((byte *)(x)))
#define  MEM_W(x) (*((word *)(x)))

04: 求最大值和最?br>#define  MAX(x,y) (((x)>(y)) ? (x) : (y))
#define  MIN(x,y) (((x) < (y)) ? (x) : (y))

05: 得到一个field在结构体(struct)中的偏移?br>#define FPOS(type,field) ((dword)&((type *)0)->field)

06: 得到一个结构体中field所占用的字节数
#define FSIZ(type,field) sizeof(((type *)0)->field)

07: 按照LSB格式把两个字节{化ؓ一个Word
#define FLIPW(ray) ((((word)(ray)[0]) * 256) + (ray)[1])

08: 按照LSB格式把一个Word转化Z个字?br>#define FLOPW(ray,val) (ray)[0] = ((val)/256); (ray)[1] = ((val) & 0xFF)

09: 得到一个变量的地址Qword宽度Q?br>#define B_PTR(var)  ((byte *) (void *) &(var))
#define W_PTR(var)  ((word *) (void *) &(var))

10: 得到一个字的高位和低位字节
#define WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))
#define WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

11: q回一个比X大的最接近?的倍数
#define RND8(x) ((((x) + 7)/8) * 8)

12: 一个字母{换ؓ大写
#define UPCASE(c) (((c)>='a' && (c) <= 'z') ? ((c) - 0x20) : (c))

13: 判断字符是不?0q值的数字
#define  DECCHK(c) ((c)>='0' && (c)<='9')

14: 判断字符是不?6q值的数字
#define HEXCHK(c) (((c) >= '0' && (c)<='9') ((c)>='A' && (c)<= 'F') \
((c)>='a' && (c)<='f'))

15: 防止溢出的一个方?br>#define INC_SAT(val) (val=((val)+1>(val)) ? (val)+1 : (val))

16: q回数组元素的个?br>#define ARR_SIZE(a)  (sizeof((a))/sizeof((a[0])))

17: q回一个无W号数n值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by ) ((dword)(val) & (dword)((mod_by)-1))

18: 对于IOI间映射在存储空间的l构,输入输出处理
#define inp(port) (*((volatile byte *)(port)))
#define inpw(port) (*((volatile word *)(port)))
#define inpdw(port) (*((volatile dword *)(port)))
#define outp(port,val) (*((volatile byte *)(port))=((byte)(val)))
#define outpw(port, val) (*((volatile word *)(port))=((word)(val)))
#define outpdw(port, val) (*((volatile dword *)(port))=((dword)(val)))

19: 使用一些宏跟踪调试
ANSI标准说明了五个预定义的宏名。它们是Q?br>__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
C++中还定义?__cplusplus

如果~译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名?br>
__LINE__ ?__FILE__ 宏指C,#line指o可以改变它的|单的Ԍ~译Ӟ它们包含E序的当前行数和文g名?br>
__DATE__ 宏指令含有Ş式ؓ??q的?表示源文件被译C码时的日期?br>__TIME__ 宏指令包含程序编译的旉。时间用字符串表C,其Ş式ؓQ?分:U?br>__STDC__ 宏指令的意义是编译时定义的。一般来Ԍ如果__STDC__已经定义Q编译器仅接受不包含Q何非标准扩展的标准C/C++代码。如果实现是标准?则宏__STDC__含有十进制常?。如果它含有M其它?则实现是非标准的?br>__cplusplus 与标准c++一致的~译器把它定义ؓ一个包含至?为的数倹{与标准c++不一致的~译器将使用h5位或更少的数倹{?br>

可以定义?例如:
当定义了_DEBUG,输出数据信息和所在文件所在行
#ifdef _DEBUG
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
#else
#define DEBUGMSG(msg,date)
#endif
 

20Q?/span> 宏定义防止错误用小括号包含?br>例如Q?br>有问题的定义Q?define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp += nr;}
应该使用的定义: #difne DO(a,b) do{a+b;a++;}while(0)
例如Q?br>if(addr)
    DUMP_WRITE(addr,nr);
else
    do_somethong_else();
宏展开以后变成q样:
if(addr)
    {memcpy(bufp,addr,nr); bufp += nr;};
else
    do_something_else();

gcc在碰到else前面?#8220;Q?#8221;时就认ؓif语句已经l束Q因而后面的else不在if语句中。而采用do{} while(0)的定义,在Q何情况下都没有问题。而改?#difne DO(a,b) do{a+b;a++;}while(0) 的定义则在Q何情况下都不会出错?br>

T.S Liu 2008-06-29 10:06 发表评论
]]>
#define、const、typedef的差??http://www.shnenglu.com/liu1061/articles/38613.htmlT.S LiuT.S LiuSun, 16 Dec 2007 06:10:00 GMThttp://www.shnenglu.com/liu1061/articles/38613.htmlhttp://www.shnenglu.com/liu1061/comments/38613.htmlhttp://www.shnenglu.com/liu1061/articles/38613.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/38613.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/38613.html#define q不是定义变量啊

#define 只是用来做文本替换的

例如Q?/p>

#define Pi 3.1415926

float angel;

angel=30*Pi/180;

那么Q当E序q行~译的时?~译器会首先?“#define Pi 3.1415926”以后的,所有代码中?#8220;Pi”全部换成 “3.1415926”

然后再进行编译?/p>

 

我查C个讲const?define的差别的帖子Q里面谈到const?define最大的差别在于Q前者在堆栈分配了空_而后者只是把具体数值直接传递到目标变量|了。或者说Qconst的常量是一个Run-Time的概念,他在E序中确实实的存在q可以被调用、传递。?define帔R则是一个Compile-Time概念Q它的生命周期止于编译期Q在实际E序中他只是一个常数、一个命令中的参敎ͼ没有实际的存在?

const帔R存在于程序的数据D,#define帔R存在于程序的代码Dc?/font>

至于两者的优缺点,要看具体的情况了。一般的常数应用Q笔者个?define是一个更好的选择Q?/font>

i.从run-time的角度来看,他在I间上和旉上都有很好优ѝ?/font>

ii.从compile-time的角度来看,cMm=t*10的代码不会被~译器优化,t*10的操作需要在run-time执行。?define的常量会被合qӞ在上例中T*10被0x82取代Q?/font>

但是Q如果你需要粗鲁的修改常数的|那就得用const了,因ؓ后者在E序中没有实际的存在。(其实应该说修Ҏ(gu)据段比代码段要简单^_^Q?/font>

 有关#define的用?/font>

1.单的define定义
#define MAXTIME 1000

E序中遇?/span>MAXTIME׃当作1000来处?/span>.
一个简单的MAXTIME定义好了,它代?/span>1000Q如果在E序里面?/span>
if(i<MAXTIME){.........}
~译器在处理q个代码之前会对MAXTIMEq行处理替换?/span>1000?/span>
q样的定义看hcM于普通的帔R定义CONSTQ但也有着不同Q因?/span>define的定义更像是单的文本替换Q而不是作Z个量来用,q个问题在下面反映的ؓH出?/span>

2.define?/span>函数定义
define
可以像函数那h受一些参敎ͼ如下
#define max(x,y) (x)>(y)?(x):(y);
q个定义将q回两个C较大的那个,看到了吗Q因?/span>函数没有cd查,好像一个函数模板似的,当然Q它l对没有模板那么安全是了。可以作Z个简单的模板来用而已?/span>
但是q样做的话存在隐(zhn)?/span>Q例子如下:
#define Add(a,b) a+b;
在一般用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意?/span>a+b然后dcQ?/span>d怹Q但是因Z用了defineQ它只是一个简单的替换Q,所以式子实际上变成?/span>
c*a + b*d
另外举一个例子:
#define pin (int*);
pin a,b;
本意?/span>a?/span>b都是int型指针,但是实际上变?/span>int* a,b;
a
?/span>int型指针,?/span>b?/span>int型变量?/span>
q时应该使用typedef来代?/span>defineQ这?/span>a?/span>b都?/span>int型指针了?/span>
所以我们在定义的时候,L一个良好的习惯Q徏议所有的层次都要加括受?/span>
3.
宏的单行定义
#define A(x) T_##x
#define B
Q?/span>xQ?/span> #@x
#define C
Q?/span>xQ?/span> #x
我们假设Q?/span>x=1Q则有:
A(1)------
Q?/span>T_1
B(1)------
Q?/span>'1'
C(1)------
Q?/span>"1"
4.define
的多行定?/font>
define
可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让h看了恶心Q?/span>
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
关键是要在每一个换行的时候加上一?/span>"\"
摘抄?/span>http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修补了几?/span>bug
5.
在大规模的开发过E中Q特别是跨^台和pȝ的Y仉Q?/span>define最重要的功能是条g~译
是Q?/span>
#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif

可以在编译的时候通过#define讄~译环境

6.
如何定义宏、取消宏
//
定义?/span>
#define [MacroName] [MacroValue]
//
取消?/span>
#undef [MacroName]
普通宏
#define PI (3.1415926)
带参数的?/span>
#define max(a,b) ((a)>(b)? (a),(b))
关键是十分容易生错误,包括机器和h理解上的差异{等?/span>
7.
条g~译
#ifdef XXX…(#else) …#endif
例如 #ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
Q?/span>endif
#ifndef XXX … (#else) … #endif

8.
头文?/span>(.h)可以被头文g?/span>C文g包含
重复包含Q重复定义)
׃头文件包含可以嵌套,那么C文g有可能包含多次同一个头文gQ就可能出现重复定义的问题的?/span>
通过条g~译开x避免重复包含Q重复定义)
例如
#ifndef __headerfileXXX__
Q?/span>define __headerfileXXX__

文g内容

#endif
 
typedef?define的用法与区别

 

一、typedef的用?/strong>

在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言~译q程的一部分Q但它ƈ不实际分配内存空_实例像:

typedef    int       INT;
typedef    int       ARRAY[10];
typedef   (int*)    pINT;

typedef可以增强E序的可L,以及标识W的灉|性,但它也有“非直观?#8221;{缺炏V?/p>

二?define的用?/strong>

#defineZ宏定义语句,通常用它来定义常?包括无参量与带参?Q以及用来实现那?#8220;表面似和善、背后一长串”的宏Q它本nq不在编译过E中q行Q而是在这之前(预处理过E?已l完成了Q但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:

#define   INT             int
#define   TRUE         1
#define   Add(a,b)     ((a)+(b));
#define   Loop_10    for (int i=0; i<10; i++)

在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代Ҏ(gu)Q大家可参看?/p>

三、typedef?define的区?/strong>

从以上的概念便也能基本清楚,typedef只是Z增加可读性而ؓ标识W另L新名U?仅仅只是个别?Q?define原本在C中是Z定义帔RQ到了C++Qconst、enum、inline的出C它也渐渐成ؓ了v别名的工兗有时很Ҏ(gu)搞不清楚与typedef两者到底该用哪个好Q如#define INT intq样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedefQ因为在早期的许多C~译器中q条语句是非法的Q只是现今的~译器又做了扩充。ؓ了尽可能地兼容,一般都遵@#define定义“可读”的常量以及一些宏语句的Q务,而typedef则常用来定义关键字、冗长的cd的别名?/p>

宏定义只是简单的字符串代?原地扩展)Q而typedef则不是原地扩展,它的新名字具有一定的装性,以致于新命名的标识符h更易定义变量的功能。请看上面第一大点代码的第三行Q?/p>

typedef    (int*)      pINT;
以及下面q行:
#define    pINT2    int*

效果相同Q实则不同!实践中见差别QpINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;

表示定义了一个整型指针变量a和整型变量b?/p>

注意Q两者还有一个行?L区别哦!



T.S Liu 2007-12-16 14:10 发表评论
]]>
明晰C++内存分配的五U方法的区别(转)http://www.shnenglu.com/liu1061/articles/38610.htmlT.S LiuT.S LiuSun, 16 Dec 2007 05:44:00 GMThttp://www.shnenglu.com/liu1061/articles/38610.htmlhttp://www.shnenglu.com/liu1061/comments/38610.htmlhttp://www.shnenglu.com/liu1061/articles/38610.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/38610.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/38610.html在C++中,内存分成5个区Q他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区?/font> 
       

         Origin:http://www.zhmy.com/blog2006004/goto723/archives/2006/29705.shtml


  ?/font>Q就是那些由~译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等?

  ?/font>Q就是那些由new分配的内存块Q它们的释放~译器不,而是q序员自己LӞ一般一个newp对应一个delete。如果程序员没有释放掉,那么在程序结束后Q操作系l会自动回收?

  自由存储?/font>Q就是那些由malloc{分配的内存块,它和堆是十分怼的,不过它是用free来结束自q生命的?

  全局/静态存储区Q全局变量和静态变量被分配到同一块内存中Q在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有q个区分了,他们共同占用同一块内存区?

  帔R存储?/strong>Q这是一块比较特D的存储区,它们里面存放的是帔RQ不允许修改Q当Ӟ你要通过非正当手D也可以修改Q而且Ҏ(gu)很多Q在《const的思考》一文中Q我l出?U方法)

明确区分堆与?/font>

  在bbs上,堆与栈的区分问题Q似乎是一个永恒的话题Q由此可见,初学者对此往往是؜淆不清的Q所以我军_拿它W一个开刀?

  首先Q我们D一个例子:

void f() {

int* p=new int[5];

}

  q条短短的一句话包含了堆与栈,看到newQ我们首先就应该惛_Q我们分配了一块堆内存Q那么指针p呢?它分配的是一块栈内存Q所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p?/span>

        在程序会先确定在堆中分配内存的大,然后调用operator new分配内存Q然后返回这块内存的首地址Q放入栈中,他在VC6下的汇编代码如下Q?

00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax


  q里Q我们ؓ了简单ƈ没有释放内存Q那么该怎么去释攑֑Q是delete p么?错了Q应该是delete []pQ这是ؓ了告诉编译器Q我删除的是一个数l,VC6׃Ҏ(gu)相应的Cookie信息去进行释攑ֆ存的工作?

  好了Q我们回到我们的主题Q堆和栈I竟有什么区别?

  主要的区别由以下几点Q?

  1、管理方式不同;

  2、空间大不同;

  3、能否生碎片不同;

  4、生长方向不同;

  5、分配方式不同;

  6、分配效率不同;

  理方式Q对于栈来讲Q是q译器自动理Q无需我们手工控制Q对于堆来说Q释攑ַ作由E序员控ӞҎ(gu)产生memory leak?

  I间大小Q一般来讲在32位系l下Q堆内存可以辑ֈ4G的空_从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲Q一般都是有一定的I间大小的,例如Q在VC6下面Q默认的栈空间大是1MQ好像是Q记不清楚了Q。当Ӟ我们可以修改Q?

  打开工程Q依ơ操作菜单如下:Project->Setting->LinkQ在Category 中选中OutputQ然后在Reserve中设定堆栈的最大值和commit?

  注意QReserve最gؓ4ByteQcommit是保留在虚拟内存的页文g里面Q它讄的较大会使栈开辟较大的|可能增加内存的开销和启动时间?

  片问题Q对于堆来讲Q频J的new/delete势必会造成内存I间的不q箋Q从而造成大量的碎片,使程序效率降低。对于栈来讲Q则不会存在q个问题Q因为栈是先q后出的队列Q他们是如此的一一对应Q以至于永远都不可能有一个内存块从栈中间弹出Q在它弹Z前,在它上面的后q的栈内容已l被弹出Q详l的可以参考数据结构,q里我们׃再一一讨论了?

  生长方向Q?font style="BACKGROUND-COLOR: #33cccc">对于堆来Ԍ生长方向是向上的Q也是向着内存地址增加的方向;对于栈来Ԍ它的生长方向是向下的Q是向着内存地址减小的方向增ѝ?/font>

  分配方式Q堆都是动态分配的Q没有静态分配的堆。栈?U分配方式:静态分配和动态分配。静态分配是~译器完成的Q比如局部变量的分配。动态分配由alloca函数q行分配Q但是栈的动态分配和堆是不同的,它的动态分配是q译器q行释放Q不需要我们手工实现?

  分配效率Q栈是机器系l提供的数据l构Q计机会在底层Ҏ(gu)提供支持Q分配专门的寄存器存放栈的地址Q压栈出栈都有专门的指o执行Q这决定了栈的效率比较?我的注释:关于EBP寄存器请参考另一文?/font>)?/span>

        堆则是C/C++函数库提供的Q它的机制是很复杂的Q例如ؓ了分配一块内存,库函C按照一定的法Q具体的法可以参考数据结?操作pȝQ在堆内存中搜烦可用的够大的I间Q如果没有够大的I间Q可能是׃内存片太多Q,有可能调用pȝ功能d加程序数据段的内存空_q样有Z分到_大小的内存,然后q行q回。显Ӟ堆的效率比栈要低得多?br>
  从这里我们可以看刎ͼ堆和栈相比,׃大量new/delete的用,Ҏ(gu)造成大量的内存碎片;׃没有专门的系l支持,效率很低Q由于可能引发用h和核心态的切换Q内存的甌Q代价变得更加昂c所以栈在程序中是应用最q泛的,q是函数的调用也利用栈d成,函数调用q程中的参数Q返回地址QEBP和局部变量都采用栈的方式存放。所以,我们推荐大家量用栈Q而不是用堆?

  虽然栈有如此众多的好处,但是׃和堆相比不是那么灉|Q有时候分配大量的内存I间Q还是用堆好一些?

  无论是堆q是栈,都要防止界现象的发生(除非你是故意使其界Q,因ؓ界的结果要么是E序崩溃Q要么是摧毁E序的堆、栈l构Q生意想不到的l果,q是在你的E序q行q程中,没有发生上面的问题,你还是要心Q说不定什么时候就崩掉Q那时候debug可是相当困难的:Q?nbsp;



T.S Liu 2007-12-16 13:44 发表评论
]]>
字符数组VS字符指针http://www.shnenglu.com/liu1061/articles/38608.htmlT.S LiuT.S LiuSun, 16 Dec 2007 05:29:00 GMThttp://www.shnenglu.com/liu1061/articles/38608.htmlhttp://www.shnenglu.com/liu1061/comments/38608.htmlhttp://www.shnenglu.com/liu1061/articles/38608.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/38608.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/38608.html1.以字W串形式出现的,~译器都会ؓ该字W串自动d一?/span>0作ؓl束W,如在代码中写"abc",那么~译器帮你存储的?/span>"abc\0"

2."abc"
是常量吗Q答案是有时是,有时不是?br>不是帔R的情?/span>Q?br>  "abc"作ؓ字符数组初始值的时候就不是Q如char str[] = "abc";因ؓ定义的是一个字W数l,所以就相当于定义了一些空间来存放"abc"Q而又因ؓ字符数组是把字W一个一个地存放的,所以编译器把这个语句解析ؓchar str[3] = {'a','b','c'};又根据上面的ȝ1Q所?/span>char str[] = "abc";的最l结果是char str[4] = {'a','b','c','\0'};做一下扩展,如果char str[] = "abc";是在函数内部写的话,那么q里?/span>"abc\0"因ؓ不是帔RQ所以应该被攑֜栈上?br>是常量的情况
  ?/span>"abc"赋给一个字W指针变量时Q如char* ptr = "abc";因ؓ定义的是一个普通指针,q没有定义空间来存放"abc"Q所以编译器得帮我们扑֜Ҏ(gu)?/span>"abc"Q显Ӟ把这里的"abc"当成帔Rq把它放到程序的帔R区是~译器最合适的选择。所以尽?/span>ptr的类型不?/span>const char*Qƈ?/span>ptr[0] = 'x';也能~译通过Q但是执?/span>ptr[0] = 'x';׃发生q行时异常,因ؓq个语句试图M改程序常量区中的东西。记得哪本书中曾l说q?/span>char* ptr = "abc";q种写法原来?/span>c++标准中是不允许的Q但是因U写法在c中实在是太多了,Z兼容cQ不允许也得允许。虽然允许,但是的写法应该是const char* ptr = "abc";q样如果后面?/span>ptr[0] = 'x'的话~译器就不会让它~译通过Q也避免了上面说的q行时异常。又扩展一下,如果char* ptr = "abc";写在函数体内Q那么虽然这里的"abc\0"被放在常量区中,但是ptr本n只是一个普通的指针变量Q所?/span>ptr是被攑֜栈上?/span>,只不q是它所指向的东西被攑֜帔R区Ş了?br>
3.
数组的类型是p数组所存放的东西的cd以及数组本n的大决定的?br>  ?/span>char s1[3]?/span>char s2[4]Q?/span>s1的类型就?/span>char[3]Q?/span>s2的类型就?/span>char[4],也就是说管s1?/span>s2都是字符数组Q但两者的cd却是不同的?br>
4
.字符串常量的cd可以理解为相应字W常量数l的cdQ如"abcdef"的类型就可以看成?/span>const char[7]

5
.sizeof是用来求cd的字节数的。如int a;那么无论sizeof(int)或者是sizeof(a)都是{于4Q因?/span>sizeof(a)其实是sizeof(type of a)

6
.对于函数参数列表中的以数l类型书写的形式参数Q编译器把其解释为普通的指针cdQ如对于void func(char sa[100],int ia[20],char *p)?/span>sa的类型ؓchar*Q?/span>ia的类型ؓint*Q?/span>p的类型ؓchar*
转自crazy wind`s blogs

T.S Liu 2007-12-16 13:29 发表评论
]]>
文g操作结http://www.shnenglu.com/liu1061/articles/38446.htmlT.S LiuT.S LiuThu, 13 Dec 2007 09:37:00 GMThttp://www.shnenglu.com/liu1061/articles/38446.htmlhttp://www.shnenglu.com/liu1061/comments/38446.htmlhttp://www.shnenglu.com/liu1061/articles/38446.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/38446.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/38446.html文g操作L用的不是很好,今天ȝ一下它可用的函?

FILE *fp = NULL;

FILE * fopen(char *filename, char *openmode)                                 打开文g

int fclose(FILE * fp)                                                                         关闭文g

int fseek(FILE *fp, long offset,  int base)                                           文g定位

void rewind(FILE *fp)                                                                      文g指针回到文g?/p>

long ftell(FILE *fp)                                                                           q回fp所指文件读写位|?/p>

int fgetc(FILE *fp)                                                                            从fp所指文件读1个char

char * fgets(char *buffer, int n, FILE *fp)                                          从fp所指文件读n个char

int fputc(char ch, FILE *fp)                                                               向fp所指文件写1个char

int fputs(char * str, FILE *fp)                                                            向fp所指文件写n个char

int fread(char *buffer, int size, int n, FILE *fp)                                   从fp所指文件读n个size到buffer

int fwrite(char *str,  int  size , int n, FILE *fp)                                     把str指向的n*size char写到文g

int fscanf(FILE *fp, char *format, args......)                                       从fp所指文件按format格式数据读到args所指的内存单元?

int fprintf(FILE *fp, char *format, args......)                                       把args的值按format所指的格式写到fp所指的文g?/p>

int feof(FILE *fp)                                                                             查文件是否结? l束反回非0?/p>

int ferror(FILE *fp)                                                                           查文件是否出?没有出错时反?

void clearerr(FILE *fp)                                                                      使fp所指的文g的错?标志和文件结束等|?br>



T.S Liu 2007-12-13 17:37 发表评论
]]>
C语言文g操作函数 ?/title><link>http://www.shnenglu.com/liu1061/articles/38441.html</link><dc:creator>T.S Liu</dc:creator><author>T.S Liu</author><pubDate>Thu, 13 Dec 2007 09:09:00 GMT</pubDate><guid>http://www.shnenglu.com/liu1061/articles/38441.html</guid><wfw:comment>http://www.shnenglu.com/liu1061/comments/38441.html</wfw:comment><comments>http://www.shnenglu.com/liu1061/articles/38441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/liu1061/comments/commentRss/38441.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/liu1061/services/trackbacks/38441.html</trackback:ping><description><![CDATA[<p><font color=#ff0000>文章分类"c/c++"里有Q但只有基本说明Q怕以后遗忘。看q篇相对详细点就留下做个备忘Q?br></font></p> <h2>C语言文g操作函数 <a >http://www.cnblogs.com/nniixl/archive/2007/04/23/724235.aspx</a></h2> <p><input id=search-key type=hidden value=C语言文g操作函数 name=search-key> </p> <div id="yaeauec" class="rl entry-titlerl fenlei-Span">分类:<a ><font color=#000000>C/C </font></a></div> <div id="ikeykai" class="entry-body nerr"><strong>13.1C语言文g<br></strong>1,两种文g存取方式(输入,输出方式)<br>序存取<br>直接存取<br>2,数据的两U存攑Ş?br>文本文g<br>二进制文? <div> </div> <div> </div> <div><strong>13.2文g指针</strong><br>定义文gcd指针变量的一般Ş?<br>FILE *指针变量?<br>例如:<br>FILE *<a name=1></a><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>1,*<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>2;</div> <div> </div> <div> </div> <div><strong>13.3打开文g</strong><br>在用文件之?需打开文g.在C里用fopen函数打开文g.格式?<br>fopen(文g?文g使用方式);<br>此函数返回一个指向FILEcd的指??<br>FILE *<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>;<br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>=fopen("file_1","r");<br>如果调用成功,<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>指向file_1,否则q回为NULL,所以ؓ了保证文件的正确使用,要进行测?采用如下语句:<br>If((<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>=fopen("file_1","r"))==NULL)<br>{<br>printf("Cannot open this file\n");<br>exit(0);<br>}<br>最常用的文件用方式及其含义如?<br>1,"r".而打开文本文g.(不存在则出错)<br>2,"rb".而打开二进制文?<br>3,"w".为写而打开文本文g.(若不存在则新?反之,则从文g起始位置?原内容将被覆?<br>4,"wb".为写而打开二进制文?<br>5,"a".为在文g后面d数据而打开文本文g.(若不存在,则新?反之,在原文g后追?<br>6,"ab".为在文g后面d数据而打开一个二q制文g.<br>最常用的文件用方式及其含义如?<br>7,"r+".和写而打开文本文g.(L,从头开?在写数据?新数据只覆盖所占的I间,其后不变)<br>8,"rb+".和写而打开二进制文?只是在随后的d?可以׃|函数设|读和写的v始位|?<br>9,"w+".首先建立一个新文g,q行写操?随后可以从头开始读.(若文件存?原内容将全部消失)<br>10,"wb+".功能?w+"?只是在随后的d?可以׃|函数设|读和写的v始位|?<br>最常用的文件用方式及其含义如?<br>11,"a+".功能?a"相同;只是在文件尾部添加新的数据后,可以从头开始读.<br>12,"ab+".功能?a+"相同;只是在文件尾部添加新数据之后,可以׃|函数设|开始读的v始位|?</div> <div> </div> <div> </div> <div><strong>13.4关闭文g</strong></div> <div>当文件的d操作完成之后,使用fclose函数关闭文g.格式如下:<br>fclose(文g指针)<br>?fclose(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);</div> <div> </div> <div><br><strong>13.5调用getc(fgetc)和putc(fputc)函数q行输入和输?/strong><br>1,调用putc(或fputc)函数输出一个字W?br>调用形式?<br>putc(ch,<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);<br>功能?字Wch写到文g指针<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>所指的文g中去.当输出成?putc函数q回所输出的字W?否则,q回一个EOF?EOF是在stdio.h库函数文件中定义的符号常?其值等?1.</div> <div> </div> <div> </div> <div><strong>13.5调用getc(fgetc)和putc(fputc)函数q行输入和输?/strong><br>例如:把从键盘输入的文本按原样输出到名为file_1.dat文g?用字W@作ؓ键盘输入l束标志.<br>#include<br>Void main()<br>{<br>FILE *fpout;<br>char ch;<br>if(fpout=fpopen("file_1","w")==NULL)<br>{<br>printf("Cannot open this file!\n");<br>exit(0);<br>}<br>ch=getchar();<br>while(ch!='@')<br>{ fputc(ch,fpout); ch=getchar(); }<br>fclose(fpout);<br>}<br>2.调用getc(或fgetc)函数输入一个字W?br>调用形式?<br>ch=getc(pf);<br>功能?从pf指定的文件中d一个字W?q把它作为函数D?<br>例如:把一个已存在盘上的file_1.dat文本文g中的内容,原样输出到终端屏q上.<br>#include<br>void main(){<br>FILE *fpin;<br>char ch;<br>if((fpin=fopen("file_1.dat","r"))==NULL)<br>{ printf("Cann't open this file!\n");exit(0);}<br>ch=fgetc(fpin);<br>while (ch!=EOF)<br>{ putchar(ch); ch=fgetc(fpin);}<br>fclose(fpin);<br>}</div> <div> </div> <div><br><strong>13.6判断文gl束函数feof<br></strong>EOF可以作ؓ文本文g的结?标志,但不能作Zq制文g的结束符.feof函数既可以判断二q制文g,又可以判断文本文?<br>?~写E序,用于把一个文本文??复制到另一个文?目的)?源文件名和目的文件名由命令行输入.命o形式如下:<br>可执行程序名 源文件名 目的文g?br>#include <br>void filecopy(FILE* ,FILE *);<br>void main(int argc,char *argv[]){<br>FILE *fpin,*fpout;<br>if(argc==3)<br>{ fpin=fopen(argv[1],"r");<br>fpout=fopen(argv[2],"w");<br>filecopy(fpin,fpout);<br>fclose(fpin);fclose(fpout);<br>}<br>else if(argc>3) <br>printf("The file names too many!!\n";<br>else<br>printf("There are no file names for input or output!!\n );<br>}<br>void filecopy(FILE *fpin,FILE *fpout)<br>{<br>char ch;<br>ch=getc(fpin);<br>while(!feof(fpin))<br>{putc(ch,fpout); ch=getc(fpin);}<br>}</div> <div> </div> <div><br><strong>13.7fscanf函数和fprintf函数</strong><br>1,fscanf函数<br>fscanf只能从文本文件中按格式输?和scanf函数怼,只不q输入的对象是磁盘上文本文g中的数据.调用形式?<br>fscanf(文g指针,格式控制字符?输入表)<br>例如:fscanf(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>,"%d%d",&a,&b);<br>fscanf(stdin,"%d%d",&a,&b);<br>{h(hun)于scanf("%d%d",&a,&b);<br>3.fprintf函数<br>fprintf函数按格式将内存中的数据转换成对应的字符,q以ASCII代码形式输出到文本文件中.Fprintf函数和printf函数怼,只是输出的内容按格式存攑ֈ盘的文本文件中.调用形式如下:<br>fprintf(文g指针,格式控制字符?输出表)<br>?fprintf(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>,"%d %d",x,y);<br>以下语句 fprintf(stdout,"%d %d",x,y)</div> <div> </div> <div><br><strong>13.8fgets函数和fputs函数<br></strong>1,fgets函数<br>fgets函数用来从文件中d字符?调用形式如下:<br>fgets(str,n,<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);<br>函数功能??strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>所指文件中dn-1个字W放入strv始地址的空间内;如果在未Ln-1个字W时,则遇到换行符或一个EOFl束本次L?q已str作ؓ函数D?<br>13.8fgets函数和fputs函数<br>2,fputs函数<br>fput函数把字W串输出到文件中.函数调用形式如下:<br>fputs(str,<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);<br>注意:Z便于d,在输出字W串?应当Zؓ的加诸如"\n"q样的字W串.<br></div> <div>#include <stdio.h><br>#include <iostream></div> <div>int main(int argc, char *argv[])<br>{<br> char arr[10] ;<br> char *ap = "hello!" ;<br> FILE *fp ;<br> if ((fp = fopen("hello.txt", "wt+")) == NULL)<br> {<br>  printf("error!") ;<br>  exit(1) ;<br> }<br>    fputs(ap, fp) ;<br><br> rewind(fp) ; //<br><br> fgets(arr, 10, fp) ;<br> printf("%s\n", arr) ;<br> fclose(fp) ;<br> return 0 ;<br>}</div> <div><br></div> <div><br><strong>13.9fread函数和fwrite函数</strong><br>例如有如下结构体:<br>struct st{<br>char num[8];<br>float mk[5];<br>}pers[30];<br>以下循环把q?0个元素中的数据输出到<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>所指文件中.<br>for(i=0;i<30;i++)<br>fwrite(&pers[i],sizeof(struct st),1,<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);</div> <div> </div> <div><br><strong>13.9fread函数和fwrite函数</strong><br>以下语句?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>所指的文g中再ơ将每个学生数据逐个d到pers数组?<br>i=0;<br>fread(&pers[i],sizeof(struct st),1,<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);<br>while(!feof(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>))<br>{ i++;<br>fread(&pers[i],sizeof(struct st),1,<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);<br>}</div> <div> </div> <div><br><strong>13.10文g定位函数</strong><br>1,<a name=0></a><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>函数<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>函数用来Ud文g位置指针到指定的位置?接着的读或写操作从此位|开?函数的调用Ş式如?<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>(pf,offset,origin)<br>pf:文g指针<br>offset:以字节ؓ单位的位U量,为长整Ş.<br>origin:是v始点,用来指定位移量是以哪个位|ؓ基准?<br>1,<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>函数<br>位移量的表示Ҏ(gu)<br>标识W?数字 代表的v始点 <br>SEEK_SET 0 文g开?br><a name=3></a><strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">SEEK_END</strong> 2 文g末尾<br>SEEK_CUR 1 文g当前位置<br>假设pf已指向一个二q制文g,?<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>(pf,3<a name=2></a><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">0L</strong>,SEEK_SET)<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>(pf,-1<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">0L</strong>*sizeof(int),<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">SEEK_END</strong>)<br>对于文本文g,位移量必L0;?<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>(pf,<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">0L</strong>,SEEK_SET)<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>(pf,<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">0L</strong>,<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">SEEK_END</strong>)<br>2. ftell函数<br>ftell函数用以获得文g当前位置指针的位|?函数l出当前位置指针相对于文件开头的字节??<br>long t;<br>t=ftell(pf);<br>当函数调用出错时,函数q回-1L.<br>我们可以通过以下方式来测试一个文件的长度:<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>,<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">0L</strong>,<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">SEEK_END</strong>);<br>t=ftell(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);<br>3.rewind函数<br>调用形式?<br>rewind(pf);<br>函数没有q回?函数的功能是使文件的位置指针回到文g的开?</div> <div> </div> <div><br><strong>13.10文g应用</strong><br>在磁盘上的test.txt文g中放?0个不于2的正整数,用函数调用方式编写程?要求实现:<br>1,在被调函数prime?判断和统?0个整C的素C及个?<br>2,在主函数中将全部素数q加到磁盘文件test.txt的尾?同时输出到屏q上.<br>#include<br>#include<br>Int prime(int a[],int n)<br>{<br>int I,j,k=0,flag=0;<br>for(i=0;i { for(j=2;j if(a[i]%j==0)<br>{ flag=0; break;}<br>else flag=1;<br>if(flag) <br>{a[k]=a[i];k++;}<br>}<br>return k;<br>}<br>void main(){<br>int n,I,a[10];<br>FILE *<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>;<br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>=fopen("test1-2.txt","r+");<br>for(n=0;n<10;n++)<br>fscanf(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>,"%d",&a[n]);<br>n=prime(a,n);<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">fseek</strong>(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>,o,2);<br>for(i=0;i {printf("%3d",a[i]);<br>fprintf(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>,"%3d",a[i]);<br>}<br>fclose(<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">fp</strong>);<br>}</div> </div> <img src ="http://www.shnenglu.com/liu1061/aggbug/38441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/liu1061/" target="_blank">T.S Liu</a> 2007-12-13 17:09 <a href="http://www.shnenglu.com/liu1061/articles/38441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>learn file op!http://www.shnenglu.com/liu1061/articles/38316.htmlT.S LiuT.S LiuWed, 12 Dec 2007 07:36:00 GMThttp://www.shnenglu.com/liu1061/articles/38316.htmlhttp://www.shnenglu.com/liu1061/comments/38316.htmlhttp://www.shnenglu.com/liu1061/articles/38316.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/38316.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/38316.html 

 1
 2/*
 3    函数说明:
 4        1)、srcFile为源文gQloc查的位置Qdatabit查的数据位,data为需要排除的数据?br> 5        2)、成功返?Q失败返?
 6*/

 7int updateContent(const char *srcFile,const int loc,const int databit, const int data)
 8{
 9    FILE *fsrc=NULL,*ftmp=NULL;
10    char BUFF[256];
11    char tempfile[]="tempfileXXXXXX";
12    char *pbitdata=NULL;
13    const char *delim=",";
14
15    assert((NULL!=srcFile) && (loc>0&& (databit>=1 && databit<=2&& (data>=0 && data<=9));
16
17    if (NULL==(ftmp=fopen(mktemp(tempfile),"w+")))
18    {//如果打开临时文gp|
19        printf("<%s:%d>open(or create) file [%s] failed!\nERROR!!! %s\n",
20            __FILE__,__LINE__,tempfile,strerror(errno));
21
22        return 0;
23    }

24
25    if (NULL==(fsrc=fopen(srcFile,"r")))
26    {//如果打开源文件失?/span>
27        printf("<%s:%d>open file [%s] failed!\nERROR!!! %s\n",
28            __FILE__,__LINE__,srcFile,strerror(errno));
29
30        fclose(ftmp);
31        remove(tempfile);
32
33        return 0;
34    }

35
36    while (!feof(fsrc))
37    {
38        char *tmpStr=NULL;
39        int curNum=1;
40
41        memset(BUFF,0,sizeof(BUFF));
42        if (NULL==fgets(BUFF,sizeof(BUFF),fsrc))
43            continue;
44        tmpStr=strdup(BUFF);
45        pbitdata=strtok(BUFF,delim);
46        while (NULL!=pbitdata)
47        {//分割字符?/span>
48            if (curNum++==loc)
49            {//已找到指定位|的数据
50                //如果不符合要?则保?否则删除
51                if (data!=*(pbitdata+databit-1)-48)
52                    fputs(tmpStr,ftmp);
53
54                free(tmpStr);
55                tmpStr=NULL;
56
57                break;
58            }

59            pbitdata=strtok(NULL,delim);
60        }

61        //如果没有扑ֈ指定的位|?/span>
62        if (NULL!=tmpStr)
63        {
64            fputs(tmpStr,ftmp);
65
66            free(tmpStr);
67            tmpStr=NULL;
68        }

69    }

70
71    if (NULL==(fsrc=freopen(srcFile,"w",fsrc)))
72    {//重新打开源文件失?/span>
73        printf("<%s:%d>reopen file [%s] failed!\nERROR!!! %s\n",
74            __FILE__,__LINE__,srcFile,strerror(errno));
75
76        return 0;
77    }

78    rewind(ftmp);
79
80    while (!feof(ftmp))
81    {//更新臛_来的文g
82        memset(BUFF,0,sizeof(BUFF));
83        if (NULL==fgets(BUFF,sizeof(BUFF),ftmp))
84            continue;
85        fputs(BUFF,fsrc);
86    }

87    fclose(fsrc);
88    fclose(ftmp);
89    remove(tempfile);
90
91    return 1;
92}

93
94


T.S Liu 2007-12-12 15:36 发表评论
]]>
þþƷа| þ99þ99Ʒӿ| ¾þþþa| 97þó˾Ʒվ| 97Ʒ91þþþþ| þþƵ| þþþһëþþ| þþþùƷ| þ99Ʒ鶹լլ| þþ99Ʒһ| ҹ޾þþþþþþ| aëƬþѲ| 99ξþþŷƷվ| þþƷһ| ۺ޾þһƷ| 99þ˾ƷۺϹۿ| ٸþþþþñŪ߳| þŷ޹ۺ| ƷƷھþø | ݺݾƷþþĻ | Ʒŷ޺ձþ| 㽶þ99| 99þۺϾƷ| þˬˬƬAV| þþݾþþ| þAVۺϺɫ| ٸִִˬëƬþú| ۺϾþۺ| þþƷҹҹҹҹҹþ| ŷ޷avþò| 鶹WWWþöڲƷ| þþƷŷպ| һƷþð͹| þþƷƷƷ| Ʒһþ| 鶹һ99þþþ| þþþþþþòҰ߳| Ժձһձþ| þŷձƷ| պƷھþ| þþƷAV鶹վ|