海阔天空

海阔凭鱼跃 天高任鸟飞

 

打开文件并统计以空格隔开的单词数目

打开文件并统计以空格隔开的单词数目

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main()
{
  ifstream   in("tencent1.cpp");
  ofstream   out("temp.cpp"); 
  int   count   =   0;  
  string   word;  
 
  while   ((in.peek() == ' ')||(in.peek() == '\n'))   //1y???°????????  
  {  
      in.get();  
  }         
          
  while(!in.eof())  
  {  
      getline(in,word,' ');  
      out<<word<<"\n";
      while ((in.peek() == ' '))                          //1y???à??????  
      {  
          in.get();  
      }  
  }  
  out.close();
 
  ifstream   in2("temp.cpp");
  while(!in2.eof())  
  {  
      getline(in2,word);  
     
      while ((in2.peek() == '\n'))                        //1y???à??
      {  
          in2.get();  
      }  
      count++;  
      cout<<"word:-->"<<endl<<word<<endl;
  }
 
  cout<<count<<endl;

  cin.get();
  return 0;
}
//使用while(in>>line)来读取文件,会直接忽略空格和回车字符


//////////////////////////////////////////////////////////////////////////////
http://zhidao.baidu.com/question/29131093.html
把这个C写的程序用C++的语言写一下
这个程序的作用是:
分析源程序文件并统计出
1.文件中的总单词数。2.文件中关键字“if”“while”“case”的数量。3.源程序文件行数

我把用C写的答案贴在下面,要求是用C++的语言格式改写,并写出注释!!!!一定要写得详细一些!!!

(或者你可以自己按照要求,不看答案,自己写出一个C++的程序!!!带注释!!!)

#include<iostream>

struct key
{
    char word[10];
    int count;
}keyword[]={"if",0,"while",0,"case",0};
FILE *file;
char fname[20],buf[500];
int num,k=0,bit=0;
char *getword(FILE *fp)
{
    int i=0;
    char c;
    while((c=fgetc(fp))!=EOF&&!(c>=65&&c<=90)&&!(c>=97&&c<=122)&&!(c=='\n'));
    if(c==EOF)
    {
        return(0);
    }
    else
        if(c=='\n')
           
        {
            bit=1;
            buf[i++]=c;
            buf[i]='\0';
            k++;
            bit++;
            return(buf);
        }
        else
            buf[i++]=c;
        while(1)
        {
            bit=1;
            c=fgetc(fp);
            if((c>=65&&c<=90)||(c>=97&&c<=122))
                buf[i++]=c;
            else
                if(c=='\n')
                {
                    k++;
                    break;
                }
                else
                    break;
        }
        buf[i]='\0';
        return(buf);
}

void lookup(char *p)
{
    int i;
    char *q,*s;
    for(i=0;i<num;i++)
    {
        q=keyword[i].word;
        s=p;
        while(*s&&(*s==*q))
        {
            s++;q++;
        }
        if(*s==*q)
        {
            keyword[i].count++;
            break;
        }
    }
    return;
}
void main()
{
    int i=0;
    long length=0;
    char *word;
    while(1)
    {
        printf("??ê?è????t??£o");
        scanf("%s",fname);
        if((file=fopen(fname,"r+"))==NULL)
        {
            printf("ê?è?óD?ó£?????ê?£?\n");
            continue;
        }
        break;
    }
    num=sizeof(keyword)/sizeof(struct key);
    while((word=getword(file))!=NULL)
    {
        lookup(word);
        if((*word)!='\n')
            length++;
    }
    fclose(file);
    printf("í3???á1?è???:\n");
    for(i=0;i<num;i++)
        printf("1??ü′ê:%s,êyá?:%d\n",keyword[i].word,keyword[i].count);
    if(bit==0)
    {
        printf("DDêy:%d\n",k);
    }
    else
        printf("DDêy:%d\n",k+1);
    printf("μ¥′êêy:%d\n\n",length);
}


c++ code:

#include <fstream> //í·???t£?2??μá?
#include <string>
#include <iostream>
using namespace std;

class key
{
public:
    string word;
    int count;
    key(string s="",int c=0):word(s),count(c){}//11?ìoˉêy,count3?ê??a0
};

key keyword[3];

fstream file;//c++à???μ????t?áD′
string fname,buf;
int num,k=1,bit=0;

bool ischar(char c){//?D??ò???×?·?ê?·??a×???
    if(c>='a' && c<='z')return true;
    if(c>='A' &&c <='Z')return true;
    if(c=='_') return true;
    return false;
}

string getword(fstream &fp)//ìáè?ò???μ¥′ê
{
    int i=0;
    char c;
   
    string ret="";
    do{
        c=fp.get();//′ó???t?D?áè?ò???×?·?
        if(c==0x0A)k++;//è?1?ê???3μ,DDêy?ó1
    }while(!ischar(c) && c!=EOF);//??1y·?×???μ?×?·?,?±μ?3???μúò???×????ò?????t?áê?
    if(c==EOF)return "";//???t?áê?·μ????
   
   
    do{
        ret+=c;//°?×?·??óμ?×?·?′?oó??
        c=fp.get();//?-àíí?é?
        if(c==0x0A)k++;
    }while(ischar(c));
    //fp.putback(c);
    return ret;
   
}

void lookup(string p)
{
    int i;
    string q,s;
    int tmp=0;
    int pos;
    for(i=0;i<num;i++)
    {
       
        if(p==keyword[i].word)//è?1?ó?1??ü×??¥??
            keyword[i].count++;
       
    }
    return;
}
void main()
{
    //éè??1??ü×?
    keyword[0].word="if";
    keyword[1].word="while";
    keyword[2].word="case";
    int i=0;
    long length=0;
    string word;
    //string fname;
    while(1)
    {
       
        cout<<"??ê?è????t??£o"<<endl;//c++ó?coutoícinà′±ê×?ê?è?oíê?3?
        cin>>fname;
        file.open(fname.c_str());//′ò?a???t
        if(!file)
        {
            cout<<"ê?è?óD?ó£?????ê?£?\n";
            continue;
        }
        break;
    }
    num=sizeof(keyword)/sizeof(struct key);
    while(!(word=getword(file)).empty())//?òμ?ò???μ¥′ê
    {
        lookup(word);
        length++;//μ¥′êêy??
    }
    file.close();
    cout<<"í3???á1?è???:\n";
    for(i=0;i<num;i++)
        cout<<"1??ü′ê:"<<keyword[i].word<<" êyá?:"<<keyword[i].count<<endl;
    //if(bit==0)
    //{
    // cout<<"DDêy:\n"<<k<<endl;
    //}
    //else
    cout<<"DDêy:"<<k<<endl;
    cout<<"μ¥′êêy:"<<length<<endl;
}


注释:sun_yanteng的问题我确实没有考虑过,修改一下,在判断字符的时候(ischar()函数)把'_'加进去就可以了,参见改过的程序。
但是要注意一点,这个问题涉及到如何定义“单词”的问题。如果说程序里任意一个变量都可以看作一个单词的话,那么"_"这个字符也会被看成单词,因为"_"也是一个合法的变量名(不信你可以试试在程序里定义: int _;编译还是能通过的)。
要不然,“单词”仅仅指的是文字意义的单词,"a_b"就会被当成两个单词,因为英语里面下划线不是单词的一部分,但转折符号"-"却可以,例如这么一个单词"self-assured"。在C++里面,这表示两个变量相减,因此是2个单词。
改过之后的程序考虑的是第一种情况,即C++的每个合法变量都当成一个单词。如果你想换成第二种情况,在ischar()函数里,把'_'换成'-'就可以了。

posted on 2007-09-28 13:03  liuym  阅读(1028)  评论(0编辑  收藏  举报

导航