今天帮别人找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. C#术语

    数字代码.文本代码.机器码.托管代码.中间语言(IL).即时编译(JIT).COM(+).应用程序域.地址控件.虚拟内存

  2. Objective-c——UI基础开发第九天(QQ好友列表)

    一.知识点: 1.双模型的嵌套使用 2.Button的对齐方式 3.优化UITableView的加载 4.layoutSubview的使用 5.cell的折叠代理 二.双模型的嵌套定义: 注意是将se ...

  3. 计算2的N次方

    总时间限制:  1000ms 内存限制:  65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N. 输出 输出2的N次方的值. 样例输入 5 ...

  4. 【P1326】超级教主

    DP优化 原题: LHX教主很能跳,因为Orz他的人太多了.教主跳需要消耗能量,每跳1米就会消耗1点能量,如果教主有很多能量就能跳很高.教主为了收集能量,来到了一个神秘的地方,这个地方凡人是进不来的. ...

  5. caffe: compile error : undefined reference to `cv::imread(cv::String const&, int)' et al.

    when I compile caffe file : .build_debug/lib/libcaffe.so: undefined reference to `cv::imread(cv::Str ...

  6. 大白话系列之C#委托与事件讲解(二)

    什么是事件?EVENT?点击事件?加载事件?一连串的模糊的概念冲击着我们弱小的脑袋 那我们首先来看一下比较正统的感念吧: 事件是类在发生其关注的事情时用来提供通知的一种方式. 事件的发生一般都牵扯2个 ...

  7. C#中锁定Word内容,样把人家的锁定内容破解了

    原文地址:http://www.cnblogs.com/name-lh/archive/2007/04/29/732620.html     教您怎样在C#中锁定Word内容,还教您怎样把人家的锁定内 ...

  8. 关于CSS Hack

    CSS Hack由于不同厂商的浏览器,如Internet Explorer,Safari,Mozilla Firefox,Chrome 等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS ...

  9. 最长公共字串(LCS)最长连续公共字串(LCCS)

    链接1:http://blog.csdn.net/x_xiaoge/article/details/7376220 链接2:http://blog.csdn.net/x_xiaoge/article/ ...

  10. javascript中的继承实现

    javascript虽然是一门面向对象的语言,但是它的继承机制从一开始设计的时候就不同于传统的其他面向对象语言,是基于原型的继承机制,但是在这种机制下,继承依然有一些不同的实现方式. 方法一:类式继承 ...