转载请注明出处
由于阅历有限,篇幅不周之处还望指出,谢谢
一、EOF教学陷阱(EOF=-1=0XFF=CTRL+Z)
刚开始学习编程的时候,看到
While Not Eof(1)
'DoSomething
Wend
这样的代码,在文件读取的时候用着会很爽,爽到忘我。
但是EOF其实并不是这么简单而已,
书本上说的,老师教的说只是带你入门,所以不会讲得很全面。这样的细节往往很容易让你犯下错误。
总所周知,#define EOF (-1)
初学的时候,文件读写的是文本文件,所以这类问题很难去关注。
但是,读取二进制文件的时候,EOF=-1就需要谨慎使用。
-1是一个字节的,也就是无符号整数255
那么,在二进制读写的时候,难免遇到有的变量的某个字节里有一个255.
这时候,如果使用while(!eof(fp))就不能正确的读写
所以我们要使用feof这个函数
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
看看EOF的真面目:
将DOC文件用记事本打开会看到很多这个玩意儿。将255写入文件当中,然后用记事本打开,就这样子了,长得还不错,呵呵。由于粘贴不上来,所以这么截图了。
我似乎想起了GSM通信中的CTRL+Z...呵呵。
置于EOF其它相关的应用,朋友们可以搜索其它博文,此处不再赘述
二、有争议的fflush(stdin)
内容可以看百度百科
三、fgets注意点
第二个参数n......实际读入的是n-1个字符,最后一个留给了'\0'。
四、文件复制注意点
在写单字节循环复制文件的程序时,有可能会这么写:
while(!feof(fsrc)){
ch=fgetc(fsrc);
fputc(ch,fdst);
}
编译通过,但是实际复制的时候,会发生点小问题,dst文件会多出一个字节,值为255,也就是EOF(在文件流中)
而这样写就会原封不动不增不减地复制文件:
while(1){
ch=fgetc(fsrc); //读取完最后一个字符才会产生eof标记(在指针结构中)
if(!feof(fsrc))
fputc(ch,fdst);
else
break;
}