2016-05-03 22 views
-2

Ich muss eine Datei lesen und dann nach Benutzer für ein Wort fragen, danach muss ich das Auftreten dieses Wortes zeilenweise anzeigen. Auch ich muss dies mit Char-Arrays überprüfen. Sie können mein Ausgabebeispiel überprüfen;Eine Worthäufigkeit in einer Textdatei Zeile für Zeile finden C++

Line 2: 1 occurrence(s) 
line 4: 2 occurrence(s) 
Line 7: 1 occurrence(s) 

Wie Sie I Linie Länge geteilt durch searchString- Länge sehen können, ist dies die maximale Zeit von searchString- die Möglichkeit des Auftretens. Also, ich muss Vorkommen anzeigen, aber mein Code zeigt diese Division als Vorkommen. Kannst du mir dabei helfen?

#include <iostream> 
#include <string> 
#include <fstream> 
#include <istream> 

using namespace std; 
int number_of_lines = 1; 

void numberoflines(); 

unsigned int GetFileLength(std::string FileName) 
{ 
    std::ifstream InFile(FileName.c_str()); 
    unsigned int FileLength = 0; 
    while (InFile.get() != EOF) FileLength++; 
    InFile.close(); 
    cout<<"Numbers of character in your file : "<<FileLength<<endl; 
    return FileLength; 
} 


int main() 
{ 
    string searchString, fileName, line; 
    int a; 
    string *b; 
    char *c,*d; 
    int wordCount = 0, count = 0,count1=0; 
    cout << "Enter file name : " << endl; 
    cin >> fileName; 
    GetFileLength(fileName); 
    cout << "Enter a word for searching procces : " << endl; 
    cin >> searchString; 



    ifstream in (fileName.c_str(), ios::in); 
    d= new char[searchString.length()+1]; 

    strcpy(d,searchString.c_str()); 

    a=GetFileLength(fileName); 
    b= new string [a]; 


    if(in.is_open()){ 
     while(!in.eof()){ 
      getline(in,line); 
      c= new char[line.length()+1]; 
      count++; 


      strcpy(c,line.c_str()); 


      count1=0; 
      for (int i = 0; i < line.length()/searchString.length(); i++) 
      { 

       char *output = NULL; 
       output = strstr (c,d); 
       if(output) { 
        count1++; 
       } 
       else count1--; 
      } 
      if(count1>0){cout<<"Line "<<number_of_lines<<": "<<count1<<" occurrence(s) "<<endl;} 
      number_of_lines++; 
      if (count==10) 
      { 
       break; 
      } 
     } 

     numberoflines(); 
    } 


    return 0; 
} 

void numberoflines(){ 
    number_of_lines--; 
    cout<<"number of lines in text file: " << number_of_lines << endl; 
} 

Ausgang: See the output

+3

* Ich habe fast das getan, aber mein Programm zeigt Zeichen Anzahl der Zeilen * Ist mir unklar. Was meinst du mit diesem Satz? – NathanOliver

+1

Ich versuche, die Speicherlecks in diesem Code zu ignorieren, aber ich versage schrecklich. – WhozCraig

+0

@WhozCraig Die Speicherverluste sind nichts im Vergleich zu der Methode zum Abrufen der Länge der Datei. – Overv

Antwort

0

Diese Schleife:

 for (int i = 0; i < line.length()/searchString.length(); i++) 
     { 
      char *output = NULL; 
      output = strstr (c,d); 
      if(output) { 
       count1++; 
      } 
      else count1--; 
     } 

wird alle Spiele der Zeichenfolge in der Zeile nicht mitgezählt, weil c und d das gleiche jedes Mal sind rufen Sie strstr() . Wenn Sie die Suche wiederholen, müssen Sie von einer Stelle nach dem vorherigen Spiel beginnen.

Es gibt auch keinen Grund, von count1 abzuziehen, wenn Sie keine Übereinstimmung finden. Sie sollten die Schleife einfach verlassen, wenn das passiert. Und es macht wenig Sinn, eine for-Schleife zu verwenden, weil Sie nichts mit i tun; Verwenden Sie einfach eine while Schleife.

 char *start = c; 
     size_t searchlen = searchString.length(); 
     while (true) 
     { 
      char *output = strstr (start,d); 
      if(output) { 
       count1++; 
       start = output + searchlen; 
      } else { 
       break; 
      } 
     } 
+0

Vielen Dank Mann, ich weiß subtrahieren und für Schleife für Strcpy Funktion hat keine Bedeutung, aber ich wusste nicht, was alles zu tun und zu versuchen. Vielen Dank. –

0

Sie müssen nicht in der gesamten Datei in ein Array oder std::string zu lesen. Ich empfehle Ihnen, dieses Programm vor der Optimierung einfach zu halten.

Wie in Ihrer Frage erwähnt, müssen Sie Zeichenarrays verwenden und Zeile für Zeile lesen.

Suchen Sie die istream::getline function, wie es sehr nützlich sein wird. Hier ist das Lesen der Datei Teil

Lassen sich eine maximale Leitungslänge von 1024.

erklären:

#define MAX_LINE_LENGTH (1024) 
char text_buffer[MAX_LINE_LENGTH]; // Look, no "new" operator. :-) 
//... 
while (my_text_file.getline(text_buffer, MAX_LINE_LENGTH, '\n')) 
{ 
//... TBD 
} 

Das obige Codefragment liest eine Textzeile in die Variable text_buffer.

Da Sie Zeichenarrays verwenden, lesen Sie bitte die "str" ​​-Funktionen in Ihren bevorzugten Texten, wie strstr; oder Sie müssen möglicherweise Ihre eigenen schreiben.

Der nächste Schritt wäre, ein "Wort" aus der Textzeile zu extrahieren.

Um ein Wort zu extrahieren, müssen wir wissen, wo es beginnt und wo es endet. Also muss die Textzeile durchsucht werden. Sehen Sie die isalpha funciton, wie es nützlich sein wird.

Hier ist eine Schleife für den Anfang zu finden und ein Wort endet:

unsigned int word_start_position = 0; // start at beginning of the line. 
unsigned int word_end_position = 0; 
const unsigned int length = strlen(text_buffer); // Calculate only once. 
while (word_start_position < length) 
{ 
    // Find the start of a word. 
    while (!isalpha(text_buffer[word_start_position])) 
    { 
    ++word_start_position; 
    } 

    // Find end of the word. 
    word_end_position = word_start_position; 
    while (isalpha(text_buffer[word_end_position])) 
    { 
    ++word_end_position; 
    } 
} 

Es gibt einige Probleme Logik in den oben genannten Code-Fragmenten für den verbleibenden O. P. zu lösen.

Der nächste Teil wäre, Code hinzuzufügen, der die Anfangs- und Endposition des Worts verwendet, um die Zeichen in dem Wort in eine andere Variable zu kopieren. Diese Variable würde dann in einer Karte oder assoziativen Array oder Wörterbuch verwendet werden, die die Anzahl der Vorkommen enthält.

Mit anderen Worten, suchen Sie den Container nach dem Wort. Wenn das Wort existiert, erhöhen Sie die zugehörige Variable für das Auftreten. Wenn es nicht existiert, fügen Sie das Wort dem Container mit einem Vorkommen von 1 hinzu.

Viel Glück!

+0

Vielen Dank! Ich werde Ihre Ratschläge in Erinnerung behalten, danke nochmal! –

+0

Wenn Sie meine Antwort hilfreich finden, klicken Sie bitte auf das Häkchen. –

Verwandte Themen