feof问题
feof()函数是我们C语言中操作文件常见的函数,也是我们最容易出错的函数
这个函数用来表示文件指针是否已经到了文件末尾的下一个位置。这个函数是通用的
可以用在文本文件和二进制文件
(EOF是文件结束的标志:
(但是注意,在文本文件中,判断文本文件在文本文件结束符为不可见字符,值为26)
(二进制中文件结束标志为-1,当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志)
我们常见的问题时用fgets读文件,然后用fputs打印,这样就会在最后一行出现问题
多输出一遍:
我们看feof在源码中定义:
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag&_IOEOF)
因此,当file position indicattor(windows fp->_ptr)到了文件末尾,然后再发生读写文件时候,fp->_flags才会被置为含有_IOEOF,然后再调用feof(),才会得到文件结束的信息。
也就是说只有文件指针到了文件末尾的下一个位置,feof才会返回1
例如程序:
while(!feof(fp))
{
fgets(str,,fp);
fpets(str,stdout);
}
在该程序段中,当我们读到最后一行,这个时候feof返回0,是正确的。
然后接着读取,由于fgets函数读取的时候会判断是否碰到了_IOFOF。此时当然是到了
因此传递给数组的内容还是上一次的,也就是说,最后一次数组没有读取 数据,还是上一次的
,因此就打印两边:
知道这个原理,我们可以巧妙的绕过去这个陷阱,设计循环的时候我们做到先判断,在输出
(fgets和feof判断相继),于是这样我们判断后就不会打印两遍:
fgets(str,,fp);
while(!feof(fp))
{
fputs(str,stdout);
fgets(str,,fp);
}
当然,如果我们不想这样设计(fgets代码写两遍,感觉不爽),可以改变其他条件
1,用fgetc判断(当然这个不太保险,因为文件出错和结束返回值一样!!!)
while((c = fgetc(fp)) != -)
{
fputc(c,fp);
}
2,要用fgets判断:遇到文件结束返回NULL
while(fgets(str,,fp))
{
fputs(str,fp)
}
getchar()函数 => :#define getchar() getc(stdin)
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCⅡ码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
有两点行为:
1,getchar是以行为单位就行存取的('\n行刷新),也就是说只有遇到回车换行或者文件结束会结束(Ctrl+z,windows)意思是你的输入必须有行刷新或者文件结束才能有下面的执行
#include <stdio.h> int main()
{
char c;
while((c =getchar())!=EOF)
{
putchar(c);
} return ;
}
对这个问题的一个解释是,并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF(Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因
2,getchar()返回字符,或者EOF(文件结束)
因此最后用int类型的来接收返回至,然后用char类型输出
由于getchar行缓冲的作用因此有时候我们要在控制台上进行结束会出现两种情况
Ctrl+z结束(这时是下一次输入提醒)
Ctrl+z,Ctrl+z(这时是一次输入刚结束,没有按行刷新,因此第一个相当于行刷新,第二个相当于文件流结束)
feof问题的更多相关文章
- C feof
功能:检测流上的文件结束符.如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除. 正确的应该是feof返回0表示文件没有结束,返回1,表示结束.feof实际观察的是上次读 ...
- C语言之EOF和feof()
EOF用于判断所操作的文件是否已经读到文件结束,是在stdio.h文件中定义的符号常量,值为-1. 即当系统读取到文件结尾,所返回的一个信号值(也就是-1). EOF不是可输出字符,因此不能在屏幕上输 ...
- PHP使用feof()函数读文件的方法
这篇文章主要介绍了PHP使用feof()函数读文件的方法,以实例形式对比了正确与错误的用法,阐明了feof()函数的使用技巧,需要的朋友可以参考下 本文实例讲述了PHP使用feof()函数读文件的方法 ...
- 使用feof()函数判断文件是否结束
课本上时这样写的:(用putchar(ch);代表对取出来的字符的处理.) while(!feof(fp)) { ch=fgetc(fp); putchar(ch); } 但是,这样写的话,fgetc ...
- feof使用注意
[feof使用注意] 以下是错误的用法,發生狀況->多讀一次?: FILE* pf; while(!feof(pf)){ //fread 讀取 //資料處理 } feof是發生在fread使用" ...
- 判断文件结束,feof……
因为文本文件中存储的是ASCII码,而ASCII码中FF代表空值(blank),一般不使用,所以如果读文件返回了FF,说明已经到了文本文件的结尾.但是如果是二进制文件,其中可能会包含FF,因此不能把读 ...
- fopen\fread\fwrite\fscanf\fprintf\fseek\feof\rewind\fgets\fputc等系列函数使用总结
转载自:http://blog.csdn.net/xidianzhimeng/article/details/23541289 1 fopen 函数原型:FILE * fopen(const char ...
- feof()
百度知道 >电脑/网络 >编程语言 >C/C++ feof()这个函数是用来判断指针是否已经到达文件尾部的. 若fp已经指向文件末尾,则feof(fp)函数值为"真&quo ...
- feof()和EOF的用法(转载)
查看 stdio.h 可以看到如下定义: #define EOF (-1) #define _IOEOF 0x0010 #define feof(_stream) ((_stream)-& ...
- 文件末尾判断feof
feof 作用:如果文件结束,则返回非0值,否则返回0 但要注意的是feof要读取到文件结束标志EOF后,才能判断文件是否结束. 所以使用while(!feof(pFile))会出现最后fread会返 ...
随机推荐
- tomcat端口占用后的解决办法【亲测有效】
https://www.cnblogs.com/zhangtan/p/5856573.html 检测正在使用的端口 这里就以win7为例进行讲解. 首先打开cmd,打开的方法很简单,在开始菜单中直 ...
- 【shell脚本学习-4】
文本处理 #!/bin/bash#----------文本处理---------- #---------------echo----------------- # "-n":处理光 ...
- java简单web爬虫(网页图片)
java简单web爬虫(网页图片)效果,执行main()方法后图片就下载道C盘的res文件夹中.没有的话创建一个文件夹代码里的常量根据自己的需求修改,代码附到下面. package com.sinit ...
- 13.4.3 鼠标与滚轮事件【JavaScript高级程序设计第三版】
鼠标事件是Web 开发中最常用的一类事件,毕竟鼠标还是最主要的定位设备.DOM3 级事件中定义了9 个鼠标事件,简介如下. click:在用户单击主鼠标按钮(一般是左边的按钮)或者按下回车键时触发.这 ...
- ElasticSearch 安装配置
1. Elasticsearch5.5.2安装 1.1.Elasticsearch安装步骤 #安装之前需安装java 环境,并配置JAVA_HOME环境变量 #直接下载Elasticsearch- ...
- 关于C++类模板无法解析的问题
自己写了一个C++模板类,可是在vs2012中死活显示无法解析它的成员函数. 开始怎么也想不通,因为我是按照普通方式布置的:头文件放声明,在同名源文件中放实现,并包含其头文件. 后来百度了一下才发现, ...
- Smart Framework:轻量级 Java Web 框架
Smart Framework:轻量级 Java Web 框架 收藏 黄勇 工作闲暇之余,我开发了一款轻量级 Java Web 框架 —— Smart Framework. 开发该框架是为了: 加 ...
- CSS流布局权威指南
http://www.cnblogs.com/qieguo/p/5421252.html
- 【APUE】Chapter3 File I/O
这章主要讲了几类unbuffered I/O函数的用法和设计思路. 3.2 File Descriptors fd本质上是非负整数,当我们执行open或create的时候,kernel向进程返回一个f ...
- vue之vue-cookies使用
一.安装vue-cookies npm install --save vue-cookies 或者 yarn add vue-cookies 二.引入vue-cookie // 方式一:require ...