• 关于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()函数的时候,需要考虑到函数检测的是上一次的读取状态而非本次读取状态。

  • 相关阅读:
    centos7.6 使用yum安装mysql5.7
    解决hadoop本地库问题
    docker-compose 启动警告
    docker 安装zabbix5.0 界面乱码问题解决
    docker 部署zabbix问题
    zookeeper 超时问题
    hbase regionserver异常宕机
    (转载)hadoop 滚动升级
    hadoop Requested data length 86483783 is longer than maximum configured RPC length
    zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  • 原文地址:https://www.cnblogs.com/TianyuSu/p/6235367.html
Copyright © 2020-2023  润新知