在程序C ++中发出打印.txt文件

时间:2017-04-27 07:23:01

标签: c++

我有一个程序,它接受一个文本文件并列出单词和使用次数。它工作,但我无法弄清楚如何打印出文本文件。在排序的单词上方以及它们出现的次数之后,我想显示文件中的文本。我该怎么办?我尝试了几件事,但它要么什么都不做,要么搞砸其余代码说有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;
}

2 个答案:

答案 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将单词列表插入代码并最小化重现错误,我将能够更好地帮助你。事实上,我希望我能帮助你。