您的位置:首页 > 其它

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

2007-09-28 13:03 375 查看
打开文件并统计以空格隔开的单词数目

#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()函数里,把'_'换成'-'就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐