我有一個程序需要一個文本文件並列出這些文字以及它們被使用了多少次。它的工作原理,但我不知道如何打印出文本文件。在排序的單詞上方以及它們出現的次數之上,我想顯示文件中的文本。我會怎麼做?我嘗試了幾件事情,但它沒有做任何事,或者把代碼的其餘部分搞砸,說有0個獨特的詞。以及最後如何將結果打印出來,使他們有更多...表-ish ...在C++程序中打印.txt文件
/*
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;
}
請修復您的代碼的格式。你的印刷看起來不錯,你確定數據'單詞'包含的是正確的嗎? –
我修好了,所以更容易閱讀。我相信是這樣。它給了我幾個測試文件的正確答案。出於某種原因,我無法獲得打印的實際文件內容。我試圖把'while(fin.good())cout <<(char)fin.get();幾個不同的地方,它搞砸了其餘的代碼。 – rcwade93
我認爲問題在於你試圖讀取輸入文件兩次(一次複製到輸出,一次打破令牌)_但你沒有重置位置!_因此,第二次嘗試將看到一個空文件。請參閱[在此答案中清除'和'seekg'調用](http://stackoverflow.com/a/7681612/2096401)。或者,您可以嘗試交錯打印和令牌化,但除非文件非常大,否則可能不值得。 – TripeHound