打开文件并统计以空格隔开的单词数目
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()函数里,把'_'换成'-'就可以了。
#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()函数里,把'_'换成'-'就可以了。
相关文章推荐
- 练习2-3:编一个程序用来打开文件并统计文件中以空格隔开的单词数目
- 输入一行字符,统计其中有多少单词,单词之间用空格隔开
- 多线程统计多个文件的单词数目---C++0x多线程使用示例
- Java 文件统计:编写程序,统计英文文本文件中的字符数目和单词数目。程序运行时,输入要统计的文件的名称,程序处理后输出字符数目和单词数目
- java统计文件中字符,数字,汉字,空格数目
- 输入一行字符,统计其中有多少个单词,单词之间用空格隔开
- 10月7日 c语言 输入一串字符,单词之间用空格隔开,统计其中有多少个单词
- 输入一行字符,统计其中有多少个单词,单词之间用空格隔开
- 08年华科机试第二题(统计文件中单词的数目)
- 打开文件读取信息,统计单词长度大于指定值的个数
- C语言练习题每练 1:字符串统计单词个数,单词由空格隔开
- java统计文件中字符,数字,汉字,空格数目
- 多线程统计多个文件的单词数目
- 统计文件中单词频率的各种算法实现
- 统计目录下面的文件所有单词
- 统计文件中出现次数最多的前10个单词
- hadoop 中MapReduce因为文件打开文件数目超过linux限制报错
- 【Shell】统计目录下文件数目
- 统计文件的单词数
- 质数保存在文本中,有上万个用空格隔开的数据,有数十个文件,寻找文件夹中所有质数文件的回文数等