读文件使用feof()多读一次的问题

读文件使用feof()多读一次的问题
这是一个经典的错误, 很多教科上都是这么写的。
 在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。
 对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。
 而我们经常这样把它使用在循环中:
int c;
 
while(!feof(fp))
 
{
 
  c = fgetc(fp);
 
  printf("%x\n",c);
 
}
 
它是先判断==>再读(可能这时就是文件尾了, 读不出东西了)
 
所以正确的代码应该是
int c; 

c = fgetc(fp);  
 
while(!feof(fp)) 
 
{
 
  printf("%x\n",c);
 
  c = fgetc(fp);  
} 
 
看出上面两段代码的区别了吧!!!

 
第二种方法就是:(不使用feof,换种方法。)
 
1、把文件内部指针移动到文件尾部。
fseek(fp,0,2);

2、用一个整形变量记录这个文件尾部的位置
wjcd = ftell(fp);
 
3、把文件内部指针移到到文件头部;
fseek(fp,0,0);
 
4、这样就可以了
while(wjcd == ftell(fp))

注: 
1)   欲将读写位置移动到文件开头时:fseek(FILE   *stream,0,SEEK_SET);
2)   欲将读写位置移动到文件尾时:fseek(FILE   *stream,0,SEEK_END);
参数SEEK_SET是从距文件开头offset位移量为新的读写位置;SEEK_CUR是以目前的读写位置往后增加offset个位移量;SEEK_END将读写位置指向文件尾后再增加offset个位移量。当whence值为SEEK_CUR或SEEK_END时,参数offset允许负值的出现。
http://blog.sina.com.cn/s/blog_705a5ff00101ab5d.html
时间: 2024-12-24 03:49:49

读文件使用feof()多读一次的问题的相关文章

Python读文件的几种方式

介绍 本文介绍在python中读取文件的方法. 正文 1. f = open(input_file) for line in f:     do_stuff(line)f.close() 2. for line in open('myfile','r').readlines():     do_something(line) readlines()读文件的时候会把整个文件一次读到内存,所以这种方法不适合读取大文件. 3. import fileinput for line in fileinpu

java创建文本、文件、读文件、写文件

1 package Head18; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileNotFoundException; 6 import java.io.FileReader; 7 import java.io.FileWriter; 8 import java.io.IOException; 9 10 public class Mkdirs_FileRW { 11 public st

GoLang几种读文件方式的比较

GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main import(    "fmt"     "os"     "flag"     "io"     "io/ioutil"     "bufio"     "time"

Python中基本的读文件和简单数据处理

Python中基本的读文件和简单数据处理 暂无评论 DataQuest上面的免费课程(本文是Python基础课程部分),里面有些很基础的东西(csv文件读,字符串预处理等),发在这里做记录.涉及下面六个案例: Find the lowest crime rate(读取csv文件,字符串切分,for循环和if判断过滤数据) Discover weather pattern in LA(for循环和if判断进行频数统计) Building a Spell Checker(词频统计,字符串预处理,字典

nodejs读文件

//读文件var fs=require("fs");fs.readFile("index.html","utf-8",function(err,data){ console.log(data);});

用stream读文件

前几天要写一个东西里面有用到读文件的. 可是我不想用FSO,我怕有的空间不支持. 可是网络上找了半天没有找到一个不是用FSO写的. 还是自己做了一个. 我记得以前在做无组件上传,并保存文件的时候有用到stream 我发现有一个LoadFromFile的方法.可以读取文件. 下面是我的代码. function readfile(URL,chartype) set srmObj = server.CreateObject("adodb.stream") srmObj.type=1 srmO

Python之路 day2 按行读文件

1 #1. 最基本的读文件方法: 2 3 # File: readline-example-1.py 4 5 file = open("sample.txt") 6 7 while 1: 8 line = file.readline() 9 if not line: 10 break 11 pass # do something 12 #一行一行得从文件读数据,显然比较慢:不过很省内存. 13 14 #在我的机器上读10M的sample.txt文件,每秒大约读32000行 15 16

[转] Bash脚本:怎样一行行地读文件(最好和最坏的方法)

用bash脚本读文件的方法有很多.请看第一部分,我使用了while循环及其后的管道命令(|)(cat $FILE | while read line; do … ),并在循环当中递增 i 的值,最后,我得到了非我所想的 i .主要的原因是,管道命令会发起子shell来读取文件,而任何在(子shell的)while循环中的操作(例如 i ++),都会随着子shell的结束而丢失. 而第二种,也是最坏的一种,其最明显的错误就是在读文件的过程中使用了for循环(for fileline in $(ca

java 读文件 解析

[Java]读取文件方法大全 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {    /**     * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件.     */    public static void readFileByBytes(String fileName) {        File file = new File(fileName);        Input