我想这样做: 一次读取一个文件中的单词。 (使用字符串执行此操作) 计算三件事:文件中有多少单字符单词,文件中有多少短(2到5个字符)单词,以及文件中有多少长(6个或更多字符)单词。帮助
我不确定如何将文件读入字符串。我知道我必须这样,但我不明白其余的。帮助
ifstream infile;
//char mystring[6];
//char mystring[20];
int main()
{
infile.open("file.txt");
if(infile.fail())
{
cout << " Error " << endl;
}
int numb_char=0;
char letter;
while(!infile.eof())
{
infile.get(letter);
cout << letter;
numb_char++;
break;
}
cout << " the number of characters is :" << numb_char << endl;
infile.close();
return 0;
答案 0 :(得分:2)
我不太清楚从哪里开始...
你的循环:
while(!infile.eof())
{
infile.get(letter);
cout << letter;
numb_char++;
break;
}
由于额外的break;
此代码看起来似乎是试图读取文件中的字符数,而不是计算5个字母或大于6个字母的单词数。
尝试类似:
ifstream infile;
int main(){
infile.open("file.txt");
if(!infile.good()){
cout << " Error " << endl;
return 1;
}
int shortCount = 0;
int mediumCount = 0;
int longCount = 0;
int charCount = 0;
char letter;
while(!infile.eof()){
infile >> letter;
if(letter == ' ' || char == EOF){ // end of word or file.
if(charCount == 1)
shortCount++;
else if(charCount < 6)
mediumCount++;
else
longCount++;
charCount = 0;
}else{
charCount++;
}
}
cout << "Short Words: " << shortCount << endl;
cout << "Medium Words: " << mediumWords << endl;
cout << "Long Words: " << longWords << endl;
infile.close();
return 0;
}
答案 1 :(得分:0)
可能是Unicode问题,您可能需要检查文件的编码,如果是Unicode,则需要使用适当的方法wfstream
和类型wchar_t
。 Unicode正变得越来越普遍,如果这是您问题的根源,我不会感到惊讶。
答案 2 :(得分:0)
正如我所提到的......你正在阅读一个角色然后突破你的循环...不要break
。
至于如何做到这一点......一种方法是定义3个计数器,int fiveMinusLetterWord
,int sixPlusLetterWord
和int singleLetterWord
。计算字符直到letter == ' '
。当你点击空格时,看看你读过多少个字符 - 这是前一个单词的长度。如果需要,递增一个计数器,重置字符计数器,然后继续执行文件末尾。请记住在循环退出后检查最后一个单词的长度。由于您一次只读一个字符,因此您还必须处理行尾分隔符。
一个更简单的方法,因为这是C ++将使用istream& getline ( istream& is, string& str );
中的<string>
并逐行读取到std::string
然后使用std::string
函数来查找单词。
编辑:我在你的问题中错过了“一次只读一个字”的部分。查看另一个答案,您可以使用std :: string从流中读取单个单词。
答案 3 :(得分:0)
#include <cctype>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string s;
vector< int > word_length_histogram;
while ( cin >> s ) // attempt to get a word and stop loop upon failure
{
while ( ispunct( * --s.end() ) ) s.erase( --s.end() ); // strip punctuation
if ( s.size() >= word_length_histogram.size() ) {
word_length_histogram.resize( s.size() + 1 );
} // make sure there's room in the histogram
++ word_length_histogram[ s.size() ];
}
最后,word_length_histogram[1]
包含1个字符的单词数,word_length_histogram[2]
包含2个字符的单词数等。将word_length_histogram
中的范围内容添加到获得您想要的特定统计数据。
答案 4 :(得分:0)
vector<string> words;
int cLength = 0;
long shortWords, medWords, longWords;
boost::algorithm::split(inputString, is_any_of(" .,-_=+;()[]\\/ [etc]"), words, token_compress_on);
for ( unsigned long i = 0; i < words.size(); i++ )
{
cLength = words[i].size();
if ( cLength < 2 ) // short word
{
shortWords++;
} else if ( cLength < 6 ) {
medWords++;
} else {
longWords++;
}
}