注册 登录
编程论坛 C++教室

如何用EOF判断文件是否结束,我的程序哪里错了

WJHHHH 发布于 2016-03-01 15:54, 4799 次点击
问题描述
有一个由字符组成的文件,请输出其中字母的个数和数字的个数。
 
【输入格式】
  输入文件由不多于10^6个字符组成(文件是否结束可用流对象的成员函数eof来判断,若为文件结束则返回值为非0值,例如cin.eof()或fin.eof()为真则表示文件结束).
 
【输出格式】
 输出文件有两行,第一行是字符串中字母的个数;第二行是字符串中数字的个数。
 
【输入输出样例】
chardigit.in
dk!@#$f  j87&^%^34-3
 
chardigit.out
4
5



我的程序
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    freopen("chardigit.in","r",stdin);  
    freopen("chardigit.out","w",stdout);
    char n;
    int s=0,t=0;
    while(cin>>n,n!=EOF)
    {
        if('a'<=(char)(n)<='z'||'A'<=(char)(n)<='Z')  
            s=s+1;  
        if('1'<=(char)(n)<='9')  
            t=t+1;
    }
    cout<<s<<endl<<t;
    return 0;
}
7 回复
#2
wp2319572016-03-01 16:03
这EOF和n有啥关系啊

 while(cin>>n,n!=EOF)
#3
WJHHHH2016-03-01 18:14
回复 2楼 wp231957
那我该怎么写
#4
rjsp2016-03-01 19:17
while(cin>>n,n!=EOF)改为while(cin>>n),题目中说的恰恰是错误用法
另外,你的那两个if判断条件有点儿奇葩。手机打字不方便,就不慢慢写了
#5
WJHHHH2016-03-01 19:20
我的新程序  为什么数字多算了一个?
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    char n;
    int s=0;
    int t=0;
    ifstream fi("chardigit.in");
    ofstream fo("chardigit.out");
    while(!fi.eof())
    {
        fi>>n;
        if((n>='A'&&n<='Z')||(n>='a'&&n<='z'))
            s++;
        else if(n>='0'&&n<='9')
            t++;
    }
    fo<<s<<endl;
    fo<<t;
    return 0;
}
#6
rjsp2016-03-01 22:04
回复 5楼 WJHHHH
4楼才说过“题目中说的恰恰是错误用法”
#7
WJHHHH2016-03-02 19:02
那我该怎么写    老师没讲    说这道题不对  但我想尝试一下
#8
rjsp2016-03-03 08:31
以下是引用WJHHHH在2016-3-2 19:02:22的发言:

那我该怎么写    老师没讲    说这道题不对  但我想尝试一下
在4楼已经跟你说过了呀“while(cin>>n,n!=EOF)改为while(cin>>n)”

程序代码:
#include <iostream>
#include <fstream>
using namespace std;

int main( void )
{
    ifstream fi( "chardigit.in" );
    ofstream fo( "chardigit.out" );

    size_t s=0, t=0;
    for( char n; fi>>n; )
    {
        if( (n>='A'&&n<='Z') || (n>='a'&&n<='z') )
            ++s;
        else if( n>='0'&&n<='9' )
            ++t;
    }
    fo << s << '\n' << t;

    fo.close();
    fi.close();
    return 0;
}

1