C语言文件操作重难点(原)

发现很多人对文件操作有不了解的,自己又回过头看了看,总结提升了一下,也小有收获。

常见的注意事项就不说了,只列举了几个个人认为有用的。

 

 

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。是有道理的……

 

 

持续更新。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值