遇文件尾测试结束c语言,Fortran和C语言测试文件尾的方法

1. int ch = fgetc(fp);

if(ch == EOF)break;

2. fgets返回NULL

3. fread返回0

还有适当的配合文件指针来使用

文件指针从0开始到size-1(其中size尾文件大小),其中后面还有一个虚拟的指针size位置(文件尾)

打开文件时候,指针指向0。

ps:文件指针到底指向哪呢?实际上就是指向将要读取的一个字节的地址,以前读过的就不算了。所以刚开始打开文件的时候,文件指针的偏移量就是,指向文件的第一个字节,因为它还没有被读取。fseek(fp,

0,

SEEK_END)就是跳过整个文件,指向文件尾巴。那个实际不存在的地方。如果此时getc的话就会返回-1出错了。但是此时调用feof是不会返回非0(遇到文件尾的),因为feof只是返回系统的一个statment的值,它是要getc

gets fread等等系统调用修改的。所以再三强调feof不是一个好方法。

fseek(fp, 0,

SEEK_END)后文件指针指向size,如果此时feof(fp)的话,是不会返回非0的,原因就是根本没有系统调用改变了那个statment的值。所以还是返回0,这样如果不做判断直接getc的话,就会获得一个-1到自己的程序中就会出错了。当然也因为这个-1(虽然你么有判断,但是系统害是该了你的statment)所以下一次调用feof的时候就会返回非0,然后才停止读取数据。但是已经错误了,所以大家要小心了啊

二进制文件的话,fread fwrite配合文件指针用吧。

首先解释一下只能用fread和fwrite的原因,也许有人不知道的吧-

-。一句话,二进制文件里面可能有大量的asc码值等于0 或者 某个字节序列 为 0xffffffff 也就是十进制-1. 比如当你int

ch=getc(fp)的时候有可能获得-1但是却么有到达文件尾。或者fgets得到0,包括0以及后面的所以数据都会被你的应用程序所抛弃。这就是为什么有人拷贝二进制文件然后文件远比以前的要小的原因。反正一句话,二进制文件用这些函数来搞就是找死。。。

fopen文件打开时候有个binary的模式,大家不能被误解了,只不过windows系统有点字符转换有点影响。根本不是说是把文件真的用二进制格式打开或者用asc格式打开了。因为说到底,文件的内容都是一样当的,在怎样打开它的内容不会变的,每个字节每个位的内容都是不会变的。从理论上来解释说就是,文件是一个物理物质,稳定性。平常遇到的按照什么asc模式和二进制模式,实际上都是实际的需要才有用的。比如可执行文件啊,图片啊,mp3啊,读写的话只要用fread

fwrite就行了啊。但是有人会说,读写二进制的文件为什么还要fopen的时候指定b模式呢。实际上,只是用于windos的,需要澄清,linux下面是一样的。windows的话如果不选b模式,系统内核会自动吧\n

转换成

\r\n两个字符,反之b模式则没有。就是说windows下面b模式文件就不同了。这时候,对于普通的asc文件,b模式没有影响,系统内核都会自动转换,对用户来说是不用担心的。

但是对于二进制文件就不同了,所以需要指定。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值