免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1920 | 回复: 8
打印 上一主题 下一主题

[C++] 读文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-02 11:07 |只看该作者 |倒序浏览
今天写一个程序,里面涉及到读写文件的. 很奇怪的就是老是多读了最后一行,调试良久都不知怎么回事.
在Win上是没问题的,在unix上就出现这样的情况,写的个测试代码如下:
大家帮忙看下是怎么回事.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
        ifstream infile("test.txt", ios_base::in);
        while (!infile.eof())
        {
                string str;
                getline(infile, str);

                cout << str << endl;
                cout << str.length() << endl;
        }
        infile.close();

        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-12-02 11:15 |只看该作者
比如说,文件的最后一个字符串是a   ,  
  当你在循环体里面读入后,文件指针指在最后这个位置,但它还不是文件尾的标志EOF,  
  所以,此时while(!infile.eof())将顺利通过,只有当这一个进入循环体内再次读文件时,  
  才会读到EOF标志,此后infile.eof()才会为真

论坛徽章:
0
3 [报告]
发表于 2008-12-02 11:21 |只看该作者
        while (true)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getline(infile, str);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(infile.eof())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << str << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << str.length() << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}


可以写成这样

论坛徽章:
0
4 [报告]
发表于 2008-12-02 11:22 |只看该作者
原帖由 5毛党党员 于 2008-12-2 11:15 发表
比如说,文件的最后一个字符串是a   ,  
  当你在循环体里面读入后,文件指针指在最后这个位置,但它还不是文件尾的标志EOF,  
  所以,此时while(!infile.eof())将顺利通过,只有当这一个进入循环体内再次读 ...


在unix下,我这个test.txt文件的最后一行是这样的, 比如:
abcdefg
光标在g上的时候用l是再移动不了的,所以说不会出现你说的这个情况.

记得当时在C下也会出现这个问题,是这样解决的:
char ch = fgetc(fp);

while (ch != EOF)
{
       ch = fgetc(fp);
       ...........
}

难道现在也是这个情况?

论坛徽章:
0
5 [报告]
发表于 2008-12-02 11:25 |只看该作者
原帖由 hr_it 于 2008-12-2 11:22 发表


在unix下,我这个test.txt文件的最后一行是这样的, 比如:
abcdefg
光标在g上的时候用l是再移动不了的,所以说不会出现你说的这个情况.

记得当时在C下也会出现这个问题,是这样解决的:
char ch = fgetc(f ...

应该是和fgetc的EOF一个道理,都是在get之后才能判断是不是EOF

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
6 [报告]
发表于 2008-12-02 11:25 |只看该作者
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifstream infile("test.txt", ios_base::in);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (getline(infile, str))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << str << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << str.length() << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infile.close();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


[ 本帖最后由 noword2k 于 2008-12-2 11:26 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-12-02 11:29 |只看该作者
原帖由 noword2k 于 2008-12-2 11:25 发表
#include
#include
#include
using namespace std;

int main()
{
        ifstream infile("test.txt", ios_base::in);
     & ...


good, 跟C里面解决这个问题是一样的 读文件行的时候也是用
while ( fgets(.....))

谢谢大家!!

论坛徽章:
0
8 [报告]
发表于 2008-12-02 12:21 |只看该作者
就像6楼那样的

论坛徽章:
0
9 [报告]
发表于 2008-12-07 11:17 |只看该作者

回复 #1 hr_it 的帖子

只有调用getline(infile, str);之后才知道是否到末尾了. 读了一行之后, 需要先判断是否在结尾, 然后才可以用的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP