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会返 ...
随机推荐
- springMVC中接收请求参数&&数据转发
### 1. 接收请求参数 #### 1.1. [不推荐] 通过HttpServletRequest获取请求参数 假设存在: <form action="handle_login.do ...
- python的pymysql模块简介
一.介绍 在python中用pymysql模块来对mysql进行操作,该模块本质就是一个套接字客户端软件,使用前需要事先安装 pip3 install pymysql 二.操作简介 import py ...
- linux 热替换so文件
http://www.zhaoch.top/操作系统/linux/热替换so文件.html 热替换so文件 www.zhaoch.top > 操作系统 > linux 发现nginx的动态 ...
- POJ2186 强连通分量+缩点
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 40234 Accepted: 16388 De ...
- windows程序内部运行机制
Windows程序内部运行机制 2007-10-21 19:52 1010人阅读 评论(0) 收藏 举报 windowsvc++applicationcallbackwinapistructure W ...
- Matplotlib 图表的样式参数
1. import numpy as np import pandas as pd import matplotlib.pyplot as plt % matplotlib inline # 导入相关 ...
- Tensorflow之MNIST的最佳实践思路总结
Tensorflow之MNIST的最佳实践思路总结 在上两篇文章中已经总结出了深层神经网络常用方法和Tensorflow的最佳实践所需要的知识点,如果对这些基础不熟悉,可以返回去看一下.在< ...
- 数据库 MySQL part2
表记录的操作 增 1.插入一条记录 语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); ...
- 介绍PHP的自动加载
昨天面试被问到了 PHP 的自动加载机制,因为很多概念模糊啦,没回答好,今天特意来总结一下. include 和 require 是PHP中引入文件的两个基本方法,但是每个脚本的开头,都需要包含(in ...
- LeetCode:19. Remove Nth Node From End of List(Medium)
1. 原题链接 https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/ 2. 题目要求 给出一个链表,请 ...