2012-03-30 8 views
2

Ok so sicher, im im etwas zu tun dumm: Deinfache C++ Funktionen

Ich habe eine Funktion:

int wordFunc(string a){ 
    std::ifstream inp; 
    inp.open(a, std::ios::in); 
    if (inp.is_open()){ 
     std::string word; 
     unsigned long wordCount = 0; 
     while(!inp.eof()){ 
      inp >> word; 
      while(word.length() > 0){ 
       wordCount++; 
      } 
      inp.close(); 
     } 
     return wordCount; 
    } 
} 

den String ist eine Benutzereingabe datei.txt - seine Menge C zu sein: \ Dump \ user.txt jetzt

, wenn ich den Code aufrufen mit:

int main(){ 
    string file; 
    int words = 0; 
    file = "C:\\Dump\\user.txt"; 

    int a = wordFunc(file, words); 
    cout << "Words: " << a << endl; 

    return 0; 
} 

die Konsole hält nur - ich havnt i codiert alles n C++ in vielen Jahren, also ich bin definitiv rostig - jede Hilfe?

EDIT Mit Hilfe einer Art sould endete Ich mag dieses

unsigned long wordFunc(const std::string& a){ 
    std::ifstream inp(a); 
    system("cls"); 
    unsigned long wordCount = 0; 
    std::string word; 
    while(inp >> word) 
    { 
     wordCount++; 
    } 
    return wordCount; 
} 

Für die Funktion steigen -

Update sollte geschrieben
+0

Sind Sie sicher, dass Sie die richtige Schnittstelle haben? Im Hauptprogramm rufen Sie wordFunc mit zwei Argumenten (Datei und Wort) auf, und die Funktion hat nur ein Argument (a). – Glenn

+0

Ja - ich habe das auch gefangen - es war definitiv die While-Schleife –

+0

Ist das Hausaufgaben? – Johnsyweb

Antwort

4

Ihr Problem ist folgendes:

 while(word.length() > 0){ 
      wordCount++; 
     } 

Dies läuft für immer. Sie wahrscheinlich meinen

 if(word.length() > 0){ 
      wordCount++; 
     } 
+0

HA - ich wusste, es war etwas redic - jetzt ich zähle nur 2 Wörter, aber ich kann das herausfinden –

+0

@Hazy, es ist, weil Sie die Datei innerhalb der Leseschleife schließen, was bedeutet, dass nur eine Zeile gelesen wird - das, zusammen mit einem Missverständnis, wann das EOF-Flag gesetzt ist, ist der Grund, warum Sie immer nur "2" als Rückgabewert bekommen. Sobald Sie das behoben haben, gibt es noch ein paar andere Dinge, die Sie sich ansehen möchten (siehe meine Antwort). – paxdiablo

1

Sie haben ziemlich viele Probleme dort.


Als ein weiteres Plakat kommentierte die Zeile:

while (word.length() > 0) 

schlingt immer, und Sie müssen es ändern:

if (word.length() > 0) 

Sie ganze Zahlen mischen und unsigned longs unpassend. Die Variablen wordCount und a und der Rückgabewert von wordFunc() sollten identisch sein.


Sie haben die inp.close()innerhalb eher die Leseschleife als draußen, wo es hingehört. Dies bedeutet, dass die Datei nach der Verarbeitung der ersten Zeile geschlossen wird.


Sie haben auch die return-Anweisung innerhalb der if Aussage bedeutet, dass Sie einen Syntaxfehler haben, nicht alles in einem Ausführungspfad zurückkehrt (die, wo die Datei nicht geöffnet werden kann).

Sie müssen die return und die darauffolgende schließende Klammer austauschen.

Das bedeutet auch, dass die Variable auch außerhalb der if Anweisung deklariert werden muss (auf der obersten Ebene der Funktion).


Ich denke fstream::open() ein char* nimmt eher als eine Zeichenfolge, so dass Sie es als neu codieren sollten:

inp.open (a.c_str(), std::ios::in); 

Ihren Anruf zu wordFunc(), mit zwei Parametern, nicht den Prototyp übereinstimmt, welches nur eins hat.


Es gibt einige Störvariablen, wie words in main().


Das letzte Wort wird zweimal gezählt, weil der EOF-Flag nur, wenn Sie gesetzt versuchen über das Ende der Datei zu lesen. Sie können das in Ordnung bringen mit einer einfachen Änderung an der if Anweisung, die wordCount erhöht:

if ((!inp.eof()) && (word.length() > 0)) { 

Mit all diesen Änderungen vorgenommen haben, Sie am Ende mit:

#include <iostream> 
#include <fstream> 

unsigned long wordFunc (std::string str) { 
    unsigned long wordCount = 0; 
    std::ifstream inp; 

    inp.open(str.c_str(), std::ios::in); 
    if (inp.is_open()) { 
     std::string word; 
     while (!inp.eof()) { 
      inp >> word; 
      if ((!inp.eof()) && (word.length() > 0)) { 
       wordCount++; 
      } 
     } 
     inp.close(); 
    } 
    return wordCount; 
} 

int main() { 
    std::string file; 
    file = "user.txt"; 
    unsigned long a = wordFunc(file); 
    std::cout << "Words: " << a << std::endl; 
    return 0; 
} 
+0

Schön. Aber ich würde wahrscheinlich zurückgehen, um ein int zurückzugeben und '-1' zurückgeben, wenn eine Datei nicht geöffnet werden konnte. Ich würde dann das 'if' invertieren, so dass Sie mit 'if (! Inp.is_open()) {return -1}' enden, und der Rest der Logik wird um eine Einzugsebene reduziert. –

1

C++ bereits Funktionen in der Standard-Bibliothek, um das meiste von dem, was Sie wollen, zu tun, so können Sie einfach etwas tun wie:

#include <fstream> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <string> 

int main() { 
    std::ifstream in("user.txt"); 

    std::cout << "Words: " 
       << std::distance(std::istream_iterator<std::string>(in), 
           std::istream_iterator<std::string>()); 
    return 0; 
} 

Erhalte Liebescode, der fünf Header für drei ausführbare Anweisungen benötigt!

Wenn Sie das Zählen auf selbst zu tun beharren, würde ich so etwas wie tun:

std::ifstream in("user.txt"); 

std::string word; 

while (in >> word) 
    ++wordCount; 

std::cout << "Words: " << wordCount; 
+0

Das ist großartig - danke! –