2013-09-28 64 views
0

我無法讀取文件,然後將列表打印到另一個文件,逐行列出每個文件的出現次數。讀取文件但打印不在讀取文件中的整數

我的工作原理,但它打印的數字:1,2,3,4,和5到輸出文件,該文件是不是在讀取的文件

的結構:

struct entry { 
string word; 
string word_uppercase; 
int number_occurences; 

};
//for array
entry myEntryArray[MAX_WORDS];
int addNewEntryHere=0; //next empty slot

我的主要電話extractTokensFromLine閱讀並放入數組:

void extractTokensFromLine(std::string &myString) { 
    const char CHAR_TO_SEARCH_FOR = ' '; 
    stringstream ss(myString); 
    string tempToken; 
    //Extracts characters from is and stores them into str until the delimitation character delim is found 
    while (getline(ss, tempToken, CHAR_TO_SEARCH_FOR)) { 
     processTokenArray(tempToken); 
    } 
} 

它通過字經過的每一行字放在一個陣列:

void processTokenArray(string &token) { 
    //temp uppercase for compare 
    string strUpper = token; 
    toUpper(strUpper); 
    //see if its already there 
    for (int i = 0; i < addNewEntryHere; ++i) { 
     if (strUpper == myEntryArray[i].word_uppercase) { 
      //yep increment count 
      myEntryArray[i].number_occurences++; 
      return; 
     } 
    } 
    //nope add it 
    myEntryArray[addNewEntryHere].word = token; 
    myEntryArray[addNewEntryHere].number_occurences = 1; 
    myEntryArray[addNewEntryHere].word_uppercase = strUpper; 

    //where next place to add is 
    addNewEntryHere++; 
} 

它然後寫入陣列到文件(每個字和它出現的次數):

bool writeArraytoFile(const std::string &OUTPUTFILENAME) { 
    fstream outfile; 
    if (!openFile(outfile,OUTPUTFILENAME,ios_base::out)) 
     return false; 
    int var; 
    for (var = 0; var < addNewEntryHere; ++var) { 
     string word = myEntryArray[var].word; 
     if(word != " " && word != "") 
      outfile<<myEntryArray[var].word << " " <<IntToString(myEntryArray[var].number_occurences)<<std::endl; 
    } 
    closeFile(outfile); 
    return true; 
} 

讀入文件是TestData.txt:

我覺得我應該想一點黃油
的,如果它不
太麻煩了一些麪包和。當你在廚房裏爲我和我的男人在這裏的時候,

我的輸出文件(使用以下方法排序):

void sortVector(sortOrder so = NUMBER_OCCURRENCES) { 
    bool shouldSwap = false; 
    for (int var = 0; var < addNewEntryHereV; ++var) { 
    for (int var1 = var+1; var1 < addNewEntryHereV; ++var1) { 
     switch (so) { 
      case ASCENDING: 
       shouldSwap =!compareAscendingV(myEntryVector, var, var1); 
       break; 
       //TODO handle the following cases appropriately 
      case DESCENDING: 
       shouldSwap =!compareDescendingV(myEntryVector, var, var1); 
       break; 
      case NUMBER_OCCURRENCES: 
       shouldSwap =!sortbyOccurrenceV(myEntryVector, var, var1); 
       break; 
      default: 
       break; 
      } 
      if (shouldSwap){ 
       std::string tmp = myEntryVector._V.at(var); 
       myEntryVector._V.at(var) = myEntryVector._V.at(var1); 
       myEntryVector._V.at(var1) = tmp; 
      } 
     } 
    } 
} 

實際輸出:

而3
I 2
這裏 。 1
人1
我1
我1
1個
expressos 1
支撐杆1
廚房1
中1
是1
你1
而1
好。1
爲1
吐司1
一些1個
麻煩1
多1
太1
不是1
其1
如果1
黃油1
位1
像1
應在1
認爲1

任何種類的建議,將不勝感激,謝謝

+0

什麼實際問題?輸出實際上是什麼樣的?輸出應該是什麼樣子? –

+0

發佈的代碼似乎沒有任何錯誤。你沒有發佈很多代碼。所以我會發布完整的程序,那麼你會很快得到答案。 – john

+0

實際的問題是輸出文件給我的數字在Read文件中沒有數字。它應該看起來像是出現次數的單詞列表 –

回答

0

您的規格並不清楚,我在某些情況下,所以我猜到了。這應該與你正在嘗試做的事情非常接近。

GCC 4.7.3:G ++ -Wall -std -Wextra = C++ 0x中字freq.cpp

#include <algorithm> 
#include <cctype> 
#include <iostream> 
#include <map> 

typedef std::map<std::string, int> histogram_t; 

std::string to_lower(const std::string& s) { 
    std::string r(s); 
    std::transform(std::begin(r), std::end(r), std::begin(r), ::tolower); 
    return r; } 

histogram_t word_freq(std::istream& is) { 
    histogram_t m; 
    std::string s; 
    while (is >> s) { ++m[to_lower(s)]; } 
    return m; } 

void outAscWord(std::ostream& os, const histogram_t& m) { 
    for (const auto& e : m) { 
    os << e.first << " " << e.second << "\n"; } } 

void outDescWord(std::ostream& os, const histogram_t& m) { 
    for (auto i = m.crbegin(); i != m.crend(); ++i) { 
    os << i->first << " " << i->second << "\n"; } } 

template <class A, class B> 
std::pair<B, A> flip_pair(const std::pair<A, B>& p) { 
    return std::pair<B, A>(p.second, p.first); } 

template <class A, class B> 
std::multimap<B, A> flip_map(const std::map<A, B>& m) { 
    std::multimap<B, A> r; 
    std::transform(m.begin(), m.end(), std::inserter(r, r.begin()), flip_pair<A,B>); 
    return r; } 

void outAscCount(std::ostream& os, const histogram_t& m) { 
    auto mm = flip_map(m); 
    for (const auto& e : mm) { 
    os << e.first << " " << e.second << "\n"; } } 

int main() { 
    // Can pass fstreams instead of iostreams if desired. 
    auto m = word_freq(std::cin); 
    outAscWord(std::cout, m); 
    outDescWord(std::cout, m); 
    outAscCount(std::cout, m); 
} 
+0

@Ninja_the_Swift,你可以發佈你的整個程序嗎? –

+0

我在地圖和模板上閱讀了更多內容,他們似乎對小數據和大數據都有效。此外,我發現我有另一個測試文件讀取下調試文件夾下的相同,它有那些隨機數字在那裏。 Eclipse將其從調試版複製到常規項目文件夾下,並使其有點歪斜(我的猜測是IDE錯誤)。它正在工作。我非常感謝你的建議。 –