我有一个程序,它接受一个文本文件并列出单词和使用次数。它工作,但我无法弄清楚如何打印出文本文件。在排序的单词上方以及它们出现的次数之后,我想显示文件中的文本。我该怎么办?我尝试了几件事,但它要么什么都不做,要么搞砸其余代码说有0个独特的单词。最后,如何将结果打印出来,以便更多...表格... ...
/*
Something like this:
Word: [equal spaces] Count:
ask [equal spaces] 5
anger [equal spaces] 3
*/
感谢您为我提供的任何帮助。
#include <iterator>
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <cctype>
using namespace std;
string getNextToken(istream &in) {
char c;
string ans="";
c=in.get();
while(!isalpha(c) && !in.eof())//cleaning non letter charachters
{
c=in.get();
}
while(isalpha(c))
{
ans.push_back(tolower(c));
c=in.get();
}
return ans;
}
string ask(string msg) {
string ans;
cout << msg;
getline(cin, ans);
return ans;
}
int main() {
map<string,int> words;
ifstream fin( ask("Enter file name: ").c_str() ); //open an input stream
if( fin.fail() ) {
cerr << "An error occurred trying to open a stream to the file!\n";
return 1;
}
string s;
string empty ="";
while((s=getNextToken(fin))!=empty )
++words[s];
while(fin.good())
cout << (char)fin.get(); // I am not sure where to put this. Or if it is correct
cout << "" << endl;
cout << "There are " << words.size() << " unique words in the above text." << endl;
cout << "----------------------------------------------------------------" << endl;
cout << " " << endl;
for(map<string,int>::iterator iter = words.begin(); iter!=words.end(); ++iter)
cout<<iter->first<<' '<<iter->second<<endl;
return 0;
}
答案 0 :(得分:1)
这样的事情应该成功:
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>
int main( int argc, char* argv[] )
{
std::string file;
std::cout << "Enter file name: ";
std::cin >> file;
std::fstream in( file.c_str() );
if ( in.good() )
{
std::unordered_map<std::string, int> words;
std::string word;
//Use this to separate your words it could be '\n' or anything else
char cSeparator = ' ';
while ( in >> word )
{
//Print the word
std::cout << word << cSeparator;
++words[word];
}
std::cout << std::endl;
//Headers Word and Count separated by 2 tabs
std::cout << "Word:\t\tCount:" << std::endl;
for ( auto& w : words )
std::cout << w.first << "\t\t" << w.second << std::endl;
}
in.close();
return EXIT_SUCCESS;
}
但是假设文本文件只包含单词,如果你有其他类型的东西,你应该可以根据需要过滤它。
答案 1 :(得分:1)
我会像这样使用一个简单的for循环:
for (int x = 0; x < words.size(); x++){
cout >> words[x] << endl
}
然后从那里进行修改以获得所需的格式。 我注意到,你没有在上面的代码的所有路径中返回main的值,这应该给出编译时错误,但是当我编译它时,由于某种原因没有。我想提醒你,你需要有一个main的返回值。除非我误解了你的问题。如果没有创建示例文件,我就无法运行此程序,因此无法在没有额外工作的情况下对其进行测试。但该程序确实编译。我没想到,因为缺少退货声明。如果你可以重现你的错误而不必创建单词的示例文件,ei将单词列表插入代码并最小化重现错误,我将能够更好地帮助你。事实上,我希望我能帮助你。