2016-04-15 9 views
0

So schreibe ich Code, der eine Datei vom Benutzer einnimmt, entfernt alle Satzzeichen. Machen Sie die Datei in Kleinbuchstaben und finden Sie alle eindeutigen Wörter. Das Problem funktioniert nicht richtig und ich weiß nicht warum. Ich drucke nicht die korrekte Anzahl eindeutiger Werte ausWie durchlaufen Zeichen im Stream C++

// convert charater to lowercase 
void convert(char& ch){ 

    ch = tolower(ch); 

} 
int main(){ 

    typedef map<string,int> siMap; 
    typedef pair<siMap::iterator, bool>ibPair; 
    typedef siMap::value_type kvpair; 
    siMap myMap; 


    string fileName1; 
    string fileName2; 
    string value; 
    char ch; 

    // get user input 
    cout << "Please enter the first file Name: "; //asking for a file name 
    cin >> fileName1; 
    ifstream infile1; 
    infile1.open(fileName1.c_str()); 

    //remove all punctuations 
    while (infile1.get(ch)) 
    { 
     if (isalpha(ch) || isspace(ch)){ 
       convert(ch); 
     } 

     else{ 
      infile1.ignore(ch); 
     } 
     infile1 >> value; 
     myMap[value]++; 
    } 

/* 
for (int i = 0; i < 10; i++) { 
     cout << infile1[i]; 

} */ 

cout << " Map size is :" << myMap.size() << endl; 

cout << "Please enter the second file Name: "; //asking for a file name 
cin >> fileName2; 
ifstream infile; 
infile.open(fileName2.c_str()); 



} 
+7

Es klingt wie Sie müssen lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Es wäre einfacher, wenn Sie das ganze lesen Zeile in eine Zeichenfolge und verwenden Sie dann 'std :: istringstream', um jedes eindeutige Wort zu verarbeiten. – PaulMcKenzie

+0

In [diesem Beispiel] (http://ideone.com/NivQ0b) erfahren Sie, wie Sie mit dem Speichern eindeutiger Wörter in einer Karte fortfahren können. Beachten Sie, dass die Verwendung von "istringstream" als Parser verwendet werden kann - führen Sie eine Suche auf SO und anderen Sites durch, und Sie sehen, dass dies die am häufigsten verwendete Methode ist. Sie müssen immer noch den Code schreiben, um die eingelesenen Zeichen zu ändern und sie in Kleinbuchstaben zu setzen, bevor sie in einer Karte gespeichert werden. – PaulMcKenzie

Antwort

-1

Können Sie Ihre erste Eingabedatei bereitstellen? Denken Sie auch daran, die Datei zu schließen, nachdem Sie damit fertig sind. Für den Debug-Teil möchten Sie vielleicht den Map-Iterator verwenden, um herauszufinden, welches Wort fehlt.

// convert charater to lowercase 
void convert(char& ch) 
{ 
    ch = tolower(ch); 
} 

int main() 
{ 
    typedef map<string,int> siMap; 
    typedef pair<siMap::iterator, bool>ibPair; 
    typedef siMap::value_type kvpair; 
    siMap myMap; 

    string fileName1; 
    string fileName2; 
    string value; 
    char ch; 

    // get user input 
    cout << "Please enter the first file Name: "; //asking for a file name 
    cin >> fileName1; 
    std::ifstream ifs(fileName1.c_str()); 
    std::string content((std::istreambuf_iterator<char>(ifs)), 
         (std::istreambuf_iterator<char>() )); 

    //remove all punctuations 
    for(std::string::iterator it = content.begin(); it != content.end(); ++it) 
    { 
     if (isalpha(*it)) 
     { 
      convert(*it); 
     } 
     else 
     { 
      *it = ' '; 
     } 
    } 

    //now working on your map 
    std::stringstream ss; 
    ss.str (content); 
    string singleWord; 
    while (ss >> singleWord) 
    { 
     myMap[singleWord]++; 
    } 
    cout << " Map size is :" << myMap.size() << endl; 

    cout << "blahblah" << endl; 
    for (std::map<string,int>::iterator it=myMap.begin(); it!=myMap.end(); ++it) 
     std::cout << it->first << " => " << it->second << '\n'; 

    cout << "Please enter the second file Name: "; //asking for a file name 
    cin >> fileName2; 
    ifstream infile; 
    infile.open(fileName2.c_str()); 
} 
+0

Nicht sicher, dass es das Verhalten Ihrer Funktion ändern würde. aber es scheint, als müssten Sie ein Leerzeichen zwischen zwei Wörtern ersetzen, wenn z. B. xxx, yy als zwei Wörter zählt – JaNL

Verwandte Themen