发现很多人对文件操作有不了解的,自己又回过头看了看,总结提升了一下,也小有收获。
常见的注意事项就不说了,只列举了几个个人认为有用的。
1. 常有人说:
EOF可以作为文本文件的结束 标志,但不能作为二进制文件的结束符.
feof函数既可以判断二进制文件,又可以判断文本文件.
这是为什么?
例:
当用文本形式读取文件(如"r"),由于读入的是字符,而ASCII码值是不可能出现-1的,因此,EOF用来处理文本文件结束是合适的。
但,当用二进制读取(如"rb"),某个字节的二进制就有可能是-1,而-1=EOF,但是,此时并不是文件的结尾,所以,为了解决此问题,feof函数诞生了。
2.二进制形式的文件,可以节省外存空间和转换时间(二进制与ASCII的转换)。但一个字节并不对应一个字
符,不能直接输出字符形式。一般中间结果需要保存在外存上,以后需要输入到内存的,常用二进制文件保存。
3.缓冲文件系统:“系统”在内存中为正在使用的文件开辟一个缓存区
非缓冲文件系统:“程序”在内存中为正在使用的文件开辟一个缓存区
UNIX下:用缓冲文件系统处理文本文件,用非缓冲文件系统处理二进制文件。
ANSI C标准:用缓冲文件系统处理文本和二进制文件。
4.注意:对于回车换行符的处理,文本文件和二进制文件是不一样的
文本文件:存入文件时,将回车换行符转换成一个换行符,在从文件读取时,执行反向操作
二进制:存入和读取都不进行转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致。
5.发现很多人说什么二进制文件打开的时候是乱码,那是因为文件编辑器的读取规范问题所致,其实你的二进制文件还是二进制。
用UE查看二进制文件和文本文件就能看出实质的区别。当然,类似此类的,QEdit等等,只要能读二进制文件的软件就可以
6. fclose的原因:应该养成良好的习惯,在写fopen的时候,就顺带的把fclose写上,免得出错。那么,为什么文件要关闭?fclose到底干了什么?
如前所述,ANSI C规定是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果,当数据未充满缓冲去而程序结束运行,就会造成缓冲区中有用的数据因为未写入到文件而丢失。
用fclose关闭文件,先是把缓冲区数据输出到文件中,然后释放文件指针(使该指针不再与当前文件相关联)
7. fprintf和fsanf函数,在对文件写入时,要经过将ASCII码转换成二进制,读取文件时,又要将二进制转
换陈ASCII码,所以,花费的时间较多。因此,在内存与磁盘频繁交换数据的情况下,最好不要用fprintf
和fscanf,而用fwrite和fread。
8. 为了便于读入,在用fputs类似的文本格式向文件中写入字符串,应当人为的加诸如"/n"这样的字符串.
9. fseek函数一般用于二进制文件,因为文本格式的文件要进行字符转换,对应的字节数可能就有错误。
例如:
将255以文本形式或者二进制形式存入文件中:
对应的ASCII码:00110010 00110101 00110101 (2对应ASCII码50,5对应53)
对应的二进制码:11111111
执行下面语句:
fseek(fp, 1L, SEEK_SET ); //文件位置指针从文件头一动一个字节位置
char bye; //存储一个字节的变量
fread(&bye, 1, 1, fp); //读取一个字节
对于以文本文件写入("w"),此时,bye中的数据就是 00110101 (也就是5)
对于二进制文件写入("wb"),此时,bye中数据也就不太清楚了……呵呵……
所以,在当你用fseek移动文件位置指针时,就有可能造成“意想不到”的结果。
所以:常有人说,文件的打开只用二进制, 对文件的读取只用fwrite,fread。是有道理的……
持续更新。。。