c++读取文件eof的疑惑

关于文件读取的eof问题 #include #include using namespace std; int main() {   char c=0;   ifstream fin("test.txt",ios::in);   if(!fin){      cout      return   }   while(!fin.eof()){      fin.get(c);      cou 阅读详情

原文地址:http://blog.chinaunix.net/uid-27034868-id-3758629.html

对于文本文件,当我们使用eof()判断文件是否结束时会多读一次(c语言也有类似的情况),或许你有遇到过这种情况。

先看下面的例子吧:

点击(此处)折叠或打开

  1. #include<iostream>
  2. #include <string>
  3. #include<fstream>
  4. #include<cstdlib>
  5. using namespace std;

  6. int main()
  7. {
  8.     char data;
  9.     ifstream infile;

  10.     infile.open("in.txt");

  11.     if(infile.fail())
  12.     {
  13.         cout<<"Fail to open the input file"<<endl;
  14.         exit(1);
  15.     }

  16.     while( !infile.eof() )
  17.     {
  18.         infile >> data;
  19.         cout << data ;
  20.     }

  21.     infile.close();
  22.     cout << endl;

  23.     return 0;
  24. }


假设输入文件in.txt的内容为:

abc

则输出结果是:abcc

明明使用了eof()判断了,为什么还是这样的呢?原因是这样的,因为eof()发现读到文件结束标志EOF(即-1)时并不会立刻返回true,

而是比较后知后觉。此时需要再读一下,这时eofbit才被设置(并且设置其他的bit,如goodbit),等下次调用eof()时才返回true。 C++ Standard Library中Constants  for  the  Stateof  Streams有一个表如下:


既然知道问题所在,问题就好解决了。

方法一:

while( !infile.eof() )

{

infile >> data;

if( infile.good() 

{

cout << data ;

}

}

或者:

while( !infile.eof() )

{

infile >> data;

if (infile.fail())

                {

                        break;

                }

cout << data ;

}

方法二:

while(infile >> data)

{

        cout << data ;

}

方法三:使用peek函数

while(infile.peek()!=EOF)

{

        infile >> data; //用>>读取时会忽略(跳过)空格等空字符,使用infile.get(data)不会

        cout << data ;

}

peek()只是查看缓冲的下一个元素,并不读取(即文件内部指针不会向后移动),c++ Standard Library中有一句描述:

 Returns the next character to be read from the  stream without extracting it.

可以看出peek有一个局限,只能在读取char类型时使用。

例如,in.txt内容为以空格隔开的字符串,因为我们在程序中写入文件时,每写入一个字符串之后跟一个空格,所以最后一个字符串之后有空格:

string str;

while(infile.peek()!=EOF)

{

        infile >> str;

        cout << str << endl;

}

同样会多读一次, 不信可以试试看,呵呵。至于如何解决,我想你应该能够举一反三了吧。

C++以EOF结尾读取多行字符串 博文背景 一直想像cat >> hello.txt或者cat >> hello.txt <<- 'EOF'这个样子以EOF为结束符读取多行文本,搜了一些函数感觉都是曲线救国,不如自己从最基础的东西开始自己造。 具体操作 #include <iostream> using namespace std; int main() { char buff[1000]; int index=0; char temp; while(temp 阅读详情

相关推荐

CAN收发器选型避坑指南:TJA1051T与TJA1051T/3的硬件兼容性问题实录

本文详细解析了CAN收发器TJA1051T与TJA1051T/3的硬件兼容性问题,通过实测数据和故障案例揭示了VIO引脚的关键差异及其对系统的影响。提供从选型到验证的完整防坑方案,帮助开发者避免常见设计错误,确保CAN总线通信的稳定性。

weixin_42715608的博客 457

读取文件时,使用file.eof()判断结尾注意事项

今天写一个小功能需要读取文件,在判断文件结尾时使用了以下语句: 1 while(infile.eof() && infile.good()) 2 { 3 infile.read((char*)&data, 1); 4 encodeData = data ^ CODE; 5 outfile.writ...

weixin_30802171的博客 2743

告别编译噩梦:Vcpkg+Cmake一站式集成Tesseract-OCR C++开发环境(Windows)

本文详细介绍了如何在Windows系统上使用Vcpkg和CMake快速集成Tesseract-OCR C++开发环境,解决传统编译过程中的依赖问题。通过一键安装和自动化配置,开发者可以高效搭建OCR识别系统,支持中英文识别,并提供了常见问题的解决方案和进阶技巧。

weixin_29009339的博客 231

C++中读入一行字符

头文件, 最好不要用 fstream.h. 我在写程序的时候,发现用后者会出现不理想的输出,具体原因不清楚,大概是C++标准的问题。  Solution1:    e.g.1         char str[90];        infile>>str;         outfile        infile>>str;         outfile        inf

ouczoe的专栏 5027

5G 网络的移动性管理上下文对比介绍

5G 网络的移动性管理上下文对比介绍 4G/5G MM移动性管理机制对比 5G引入了新移动性管理状态,通过mobility pattern(移动方式)实现按需的移动性管理等。 MM的相关状态分为一下几种: RM状态(用户注册管理 注册态/非注册态)和CM状态(用户连接态/空闲态)独立;RM状态标识UE是否注册到网络,CM状态标识UE和核心网的信令连接是否存在。 RAN侧引入RRC-inactive state:UE(用户端)对于CN(核心网)而言处于连接态,对RAN(接入网)而言处于Ld..

m0_59032675的博客 4819

【Anaconda】conda国内镜像源快速配置指南(清华/阿里云)

本文详细介绍了如何为Anaconda配置国内镜像源(清华/阿里云),以显著提升conda包下载速度并减少安装失败率。通过分步指南和实用技巧,帮助开发者快速完成配置,优化Python开发环境。

weixin_33725722的博客 1486

使用ifstream读取txt时eof问题

ifstream infile infile.open("xxx.txt"); int x; while(!infile.eof()) infile>>x; 以为当读完最后一个字符时,infiile.eof()变为true,实际中发现当读完最后一个字符时,还会再读一次,当发现没有新的可以给x时,eof()才会变为true,这个时候的x会跟最后一个字符一样,导致我们读取的实际内...

春江花月夜 2479

配电网故障重构/孤岛划分/故障恢复

程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。

zhangxd212489的博客 2500

c++ eof 读取文件最后一个字符读取两遍

在用ifstream循环(eof判断是否结束)读取文件中字符时,发现最后一个字符读取了两遍,原错误代码: char ch; ifstream infile("input.txt",ios::in); while(!infile.eof()) { infile&gt;&gt;ch; cout&lt;&lt;ch; } 输入: 运行输出: 修改循环,改成用get先获取字符,判断一...

mie haha 3219

Couldn‘t find device with uuid 恢复LVM元数据 linux

Couldn't find device with uuid 恢复LVM元数据 linux欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使

m0_57559579的博客 7166

Newton & Nvidia 开源 GPU 加速机器人仿真器入门教程(一)

Newton 是一个 GPU 加速、可扩展和可微分的物理仿真引擎,专为机器人、研究和高级仿真工作流而设计。Newton 基于 NVIDIA Warp 并集成了 MuJoCo Warp,为用户和开发人员提供了高性能仿真、现代 Python API 和灵活的架构。

机器人控制与仿真应用 1482

文件读取信息,EOF()多读问题

http://www.yyycode.cn/index.php/2020/06/06/%e6%96%87%e4%bb%b6%e8%af%bb%e5%8f%96%e4%bf%a1%e6%81%af%ef%bc%8ceof%e5%a4%9a%e8%af%bb%e9%97%ae%e9%a2%98/ 在写文件读取的时候,第一次用iFile.eof()的时候,发现多了一行 然后网上冲浪了之后查了一下,发现改成iFlie.peek()有用。 然后过了段时间接着写的时候发现又多读入了一行。 再次网上冲浪。解.

代码笔记本 759

聊聊蓝牙配对技术-CTKD OVER BR/EDR

摘要:本文探讨了蓝牙设备通过跨传输密钥派生(CTKD)机制实现双模连接的技术细节。研究发现,手机在连接双模耳机时优先通过BR/EDR配对,再利用CTKD派生BLE连接所需的密钥。关键条件包括:设备地址一致性、启用安全连接(Secure Connection)及禁用justworks配对方式。文章详细剖析了从BR/EDR链路密钥派生BLE长期密钥(LTK)的算法流程,重点解析了H6/H7加密函数的作用机制与安全差异。研究还通过HCI日志验证了密钥交换和加密建立的完整过程,指出蓝牙5.1版本对CTKD安全性的强

十多年蓝牙协议软件开发,擅长蓝牙协议分析 2692

C++eof()判断是否读取到文件尾

C++借助eof()函数,判断是否读到文件尾。

qq_62390970的博客 4792

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ ifstream eof()的使用

C++ ifstream eof() 的使用 eof() 的使用方法1 ifstream.eof() 读到文件结束符时返回true。 大家可能有一个误区,认为读到文件结束符就是读到文件的最后一个字符。 其实不然,文件结束符是文件最后一个字符的下一个字符0xFF,eof() 读到文件结束符0xFF时返回true。 代码验证1 先来看看如下这段代码2: #include <iostream> #include <fstream> #include <string> using

Nine_CC的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++文件读取末尾 eof()

相信大家都有用过c++的文件读写流,在读写文件时,利用eof()来判断是否已经达到文件末尾,如下: ifstream inf("test.txt"); if ( !inf.is_open() ) { cout <<"打开文件错误!" <<endl; } else { string shape; string answer; bool right_

Kai_gai的专栏 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++之EOF()

    fstream流的eof()判断有点不合常理    按常理逻辑来说,如果到了文件末尾的话,eof()应该返回真,但是,C++输入输出流如何知道是否到末尾了呢?    原来根据的是:如果fin>>不能再读入数据了,才发现到了文件结尾,这时才给流设定文件结尾的标志,此后调用eof()时,才返回真。    假设    find>>x; //此时文件刚好读完最后一个数据(将其保存在

韦编二绝 3万+

C++读取txt文件内容方式

C++读取txt文件内容方式一级目录二级目录三级目录 鉴于网上的好多内容瞎鸡儿写,然而平时经常会使用到,因此在这里做一个总结。 一级目录 二级目录 三级目录

泠山的博客 1万+

C++读取txt文件

按行读取字符串,并(追加)写入另一个文件 注意:ifstream和ofstream的定义,ofstream里的ios::app,以及getline函数,“<<”重定向的使用。 int main() { ifstream myfile("in.txt"); ofstream outfile("out.txt",ios::app); //ios::app指追加写入 string...

It's the Climb 2万+

C++文件读取的四种情况

C++文件读取的四种情况

weixin_62210536的博客 2万+

C/C++ ifstream之eof()

 用ifstream的eof(),竟然读到文件最后了,判断eof还为false。网上查找资料后,终于解决这个问题。参照文件:http://tuhao.blogbus.com/logs/21306687.html 在使用C/C++读文件的时候,一定都使用过eof()这个函数来判断文件是否为空或者是否读到文件结尾了,也会在使用这个函数的过程中遇到一些问题,如不能准确的判断是否为空或者是

rebel_321的专栏 3万+

C++文件读取ifstream

使用ifstream流来读取文件 说明: 1.ifstream类的对象创建成功的时候会返回非空值,借此判断是否创建文件对象成功 2.ifstream有个函数eof()用来判断文件是否读到尾部,没读到尾部返回false,否则返回true。 若尾部有回车,那么最后一条记录会读取两次。 若尾部没有回车,那么最后一条记录只会读取一次 3.iftream的对象假设为fin,fin在读取数据的时候会根据你的输出对象来选择输出的方式。 即: ifstream fin("abc.txt"); while(fin.eof()

flying_coding的博客 1万+

C++文件读取的四种方式

第四种方法:利用ifs内部的get()函数一个个的将字符读出来,遇到EOF时返回False退出while循环,EOF 是 end of file的标志,不太建议使用这个,因为这个很慢,只能一个一个字符读取。局限性:由于“

m0_74756975的博客 3万+

C++文件操作之eof函数问题

关于eof函数       fstream / ifstream / ofstream 类中的 成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();       在使用这个函数时,如执行下面代码: #include #include using namespace std; int main(){ o

pear的学习笔记 1万+

C++文件eof()函数的小细节

代码段: #include<bits/stdc++.h> using namespace std; int main() { ifstream ifile("date.txt", ios::in); char s[100] = {0}; if (ifile) { int i = 0; for (char c ; !ifile.eof(); ++i) { ifile>>c; s[i] = c; } } cout<<s<<

fancy_male的博客 2132
上一篇: JAVA文件操作类和文件夹的操作
下一篇: Camshift知识点
Micro_Ryan
博客等级 码龄12年 27粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值