zoukankan      html  css  js  c++  java
  • 关于fefo函数

    feof是C语言标准库函数函数,其原型在stdio.h中,其功能是检测流上的文件结束符。

    函数原型:

    int feof(FILE *stream);
    返回值:如果文件结束,则返回非0值,否则返回0
    在使用过程中发现一些问题:
    demo1:功能,复制文件内容
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(){
     4     FILE *pt,*pt1;
     5     char ch;
     6     pt=fopen("in.txt","r");
     7     pt1=fopen("out.txt","w");
     8     if(!pt || !pt1){
     9         printf("Open error!
    ");
    10         exit(0);
    11     }
    12     while(!feof(pt)){
    13         putchar(ch=fgetc(pt));
    14         printf("	%d
    ",ch);
    15         putc(ch,pt1);
    16     }
    17     return 0;
    18 }
    View Code

    in.txt:123                   size:3byte

    out.txt:123            size:4byte

    运行截图:

    分析:

    通过这个代码,我们原本想复制in.txt中的文本到out.txt中,但是结果显示out.txt文件体积变大,为什么会这样呢?

    首先,我们把每一个从in.txt读取到的字符输出到屏幕并且输出其ASCII码,结果显示循环了4次,和我们想的不太一样。问题就出在这里,在我们认为while()循环执行到第3次的时候,第4次是不可以进入循环的。但事实上,程序进入了循环体,并且还读到了一个字符,用putchar()无法输出,但是其整形输出为-1,可以猜想到是读到了EOF。这时我们回到循环条件,发现feof函数检测的是上一次是否读入成功,而不是检测本次是否可读,起始执行feof函数返回0,当读完3的时候,feof状态为0,因此还是满足循环条件,进入循环,这时就读取到了EOF,就会出现输出-1的情形,文件随之也会被扩大。

    解决方法:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(){
     4     FILE *pt,*pt1;
     5     char ch;
     6     pt=fopen("in.txt","r");
     7     pt1=fopen("out.txt","w");
     8     if(!pt || !pt1){
     9         printf("Open error!
    ");
    10         exit(0);
    11     }
    12    while(~(ch=fgetc(pt))){
    13         putchar(ch);
    14         printf("	%d
    ",ch);
    15         putc(ch,pt1);
    16     }
    17     return 0;
    18 }
    View Code

    通过检测getc()的返回值来确定是否执行到文件末尾标记符,当读取到EOF时,函数返回-1,因此不会进入循环体。

    运行截图:

    输出文件: out.txt 内容为:123      size:3byte

    -------------------------------------------------------------------------------

    用过这样的解决方法可以得到相同大小的复制文件,因此在使用feof()函数的时候,需要考虑到函数检测的是上一次的读取状态而非本次读取状态。

  • 相关阅读:
    log4net封装类
    (转)MySQL InnoDB 架构
    备份宽带不足,innobackupex备份导致从库不可写
    从库查询阻塞xtrabackup备份,应该是kill备份还是kill查询的问题
    rabbitmq群集安装
    MySQL索引选择问题(要相信MySQL自己选择索引的能力)
    binlog_format产生的延迟问题
    命令行登录mysql报Segmentation fault故障解决
    MySQL5.7.21启动异常的修复
    大查询对mha切换的影响
  • 原文地址:https://www.cnblogs.com/TianyuSu/p/6235367.html
Copyright © 2011-2022 走看看