今天帮别人找BUG,是一段关于c++读写文件的问题,使用的是ifstream与outstream类,关于ofstream与ifstream的用法,此处不再獒述,见代码:

#include<iostream>
#include<fstream>
using namespace std; int main()
{
ofstream outfile("student.dat");
char name[],id[];
int math,eng,computer; for(int i = ; i < ; ++i)
{ cout<<" input name: "; cin>>name;
cout<<" input id: "; cin>>id;
cout<<" input math: "; cin>>math;
cout<<" input eng: ";cin>>eng;
cout<<" input computer: "; cin>>computer;
//写文件
outfile<<name<<" "<<id<<" "<<math<<" "<<eng<<" "<<computer<<endl; }

   向文件写完之后,再从文件中读取,源码如下:
include<iostream>
#include<fstream>
using namespace std; int main()
{
ifstream infile("student.dat");
char name[],id[];
int math,eng,computer; int i = ;
char c;
while((c=infile.get())!=EOF)
{ infile>>name>>id>>math>>eng>>computer;
cout<<"name: "<<name<<endl;
cout<<"id: "<<id<<endl;
cout<<"math: "<<math<<endl;
cout<<"eng: "<<eng<<endl;
cout<<"computer: "<<computer<<endl; }
infile.close(); }

  

看似无问题,但每次从文件中读出的结果总会多出一组数据(最后一组数据会读出两边),找了好久都没有发现,经网上查阅资料总结为以下几点:

1.由于采用的写入语句为“outfile<<name<<" "<<id<<" "<<math<<" "<<eng<<" "<<computer<<endl;“,即每次写完一组数据后,都会向文件中写入一个回车符,所以在读文件的时候,当读到最后一组数据时,读完之后,文件中还有一个回车符没有读出来,此时判断eof()并不为-1,故还会再进行一次读操作;这次读操作实际上并没读到什么,但还有一个输出,输出的为上次读操作的结果,故最后一组数据显示两次。

2.eof()判断的是文件中所有的字符包括回车,只有当文件中什么字符都没有了,才会返回-1,到达文件的末尾。

3.故再使用infile和outfile对文件进行操作时,应该先读再判断(例如,本例中,先读一个name,再进行判断,当遇到最后一个回车符时,会有infile>>name这个操作正好解决了它这样能保证你写的和读的内容是一样的。

4.所以,较好的读文件方式如下

infile>>name;
while((c=infile.get())!=EOF)
{ infile>>id>>math>>eng>>computer;
cout<<"name: "<<name<<endl;
cout<<"id: "<<id<<endl;
cout<<"math: "<<math<<endl;
cout<<"eng: "<<eng<<endl;
cout<<"computer: "<<computer<<endl; infile>>name; }

c++中ifstream读文件的问题(关于eof())的更多相关文章

  1. 【练习】Java中的读文件,文件的创建,写文件

    前言 大家好,给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 读文件 public static void read(String path,String filename){ ...

  2. Java中的读文件,文件的创建,写文件

    前言 大家好,我是 Vic,今天给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 示意图 读文件 public static void read(String path,Strin ...

  3. Java NIO中的读和写

    一.概述 读和写是I/O的基本过程.从一个通道中读取只需创建一个缓冲区,然后让通道将数据读到这个缓冲区.写入的过程是创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作. 二.从文件中读取 ...

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

    Python中基本的读文件和简单数据处理 暂无评论 DataQuest上面的免费课程(本文是Python基础课程部分),里面有些很基础的东西(csv文件读,字符串预处理等),发在这里做记录.涉及下面六 ...

  5. java中多种方式读文件

    转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...

  6. 在Web工程中,普通Java类如何读文件

    我们在以前讨论过在Web工程不能采用Java工程原先的读取方式,即创建一个文件流(FileInputStream)并给出一个文件目录(从src开始找一直找到你要读取文件的目录),这种的方式是不可行的. ...

  7. 如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件)

    如何在CRichEditCtrl控件中直接读如RTF格式的文件   Inserting an RTF string using StreamIn   ------------------------- ...

  8. WPF程序中App.Config文件的读与写

    WPF程序中的App.Config文件是我们应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,所以它是一种高效的程序配置方式,那么今天我就 ...

  9. c++ ifstream ofstream 文件流

    #include <fstream>ofstream //文件写操作 内存写入存储设备 ifstream //文件读操作,存储设备读区到内存中fstream //读写操作,对打开的文件可进 ...

随机推荐

  1. Hibernate两个列作为唯一索引

    <hibernate-mapping package="hjds.domain.privilege">    <class name="AdminRol ...

  2. HDU-1561 The more, The Better (树形DP+分组背包)

    题目大意:给出一片森林,总共有n个点,并且都有权值.从中选出m个,使权值和最大.其中,选某个节点之前必须先选其父节点. 题目分析:给所有的树都加一个共同的权值为0的根节点,使森林变成一棵树.定义状态d ...

  3. 《苹果开发之Cocoa编程》挑战1 创建委托 练习

    <苹果开发之Cocoa编程>第4版 P87 新建一个单窗口应用程序,设置某对象为窗口的委托,当用户调整窗口尺寸时,确保窗口高度为宽度的2倍. 需要实现的委托方法为:-(NSSize)win ...

  4. CUDA学习笔记(二)【转】

    来源:http://luofl1992.is-programmer.com/posts/38847.html 编程语言的特点是要实践,实践多了才有经验.很多东西书本上讲得不慎清楚,不妨自己用代码实现一 ...

  5. Sklearn库例子2:分类——线性回归分类(Line Regression )例子

    线性回归:通过拟合线性模型的回归系数W =(w_1,…,w_p)来减少数据中观察到的结果和实际结果之间的残差平方和,并通过线性逼近进行预测. 从数学上讲,它解决了下面这个形式的问题:      Lin ...

  6. easyUI之window

    window组件是一个可拖动.浮动的面板,用于显示信息.内容可用 href或ajax获取. window是一个显示窗口,同时也可以显示layout的功能(也就是创建复合的组合窗口),如 <div ...

  7. centos7下环境配置

    1:  安装memcached 问题:error: libevent is required. If it's already installed, specify its path using –w ...

  8. php-mysql-excel

    <?php $fname = $_FILES['MyFile']['name']; $do = copy($_FILES['MyFile']['tmp_name'],$fname); if ($ ...

  9. Redis 高可用性解决方案(Sentinel)

    Sentinel是Redis的高可用性解决方案: 由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主 ...

  10. ASP.NET MVC在服务端把异步上传的图片裁剪成不同尺寸分别保存,并设置上传目录的尺寸限制

    我曾经试过使用JSAjaxFileUploader插件来把文件.照片以异步的方式上传,就像"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01- ...