0

I am writing a program that can count the number of times a word is found in a external file. The words that are to be searched for are also in an external file but I am able to retrieve those just fine. I realised that it will only update the value of count if the word exactly matches. So for example if I was searching for the word "School" and the word "school" was in the textfile I don't think the value of count would be changed. I also think that count wouldn't be changed if the word to be search for was "SCHOOL" and the word in the textfile was "school". So how do I edit my if statements so that for example the word "school" would match "SCHOOL" AND "School"?

This is my main function:

#include <iostream>
#include "ReadWords.h"
#include "Writer.h"
#include <cctype>
#include <string>

using namespace std;


int main() {

    int x = 9;


    int count = 0;
    int count0;
    int count1;
    int count2;
    int count3;
    int count4;
    int count5;
    int count6;
    int count7;
    int count8;
    int count9;


    int scount;
    const int size = 10;
    string word_search[size];
    string word;

    cout << "Please enter a filename: " << flush;

    char filename[30];
    cin >> filename;
    ReadWords reader(filename);



    while (reader.isNextWord()){
        count = count + 1;
        reader.getNextWord();


    }


    cout << "There are: " << count << " words in the play" << endl;


    cout << "Please enter the name of the file with the search words: " << flush;

    char filename1[30];
    cin >> filename1;
    ReadWords reader1(filename1);

    scount = 0;
    while (reader1.isNextWord()) {

        word_search[scount] = reader1.getNextWord();
        ++scount;

    }

    cout << "" << endl;

    while (reader.isNextWord()) {

This is where I attempted to convert the input to upper case to see if the word matches the uppercase version of itself but this didn't work. Here I also need to check if the word matches itself if the first letter is capital?

        if (reader.getNextWord() == word_search[0] || toupper(reader.getNextWord()) == word_search[0]) {
            count0 = count0 + 1;
        }
        if (reader.getNextWord() == word_search[1]) {
                count1 = count1 + 1;
            }

        if (reader.getNextWord() == word_search[2]) {
                count2 = count2 + 1;
            }
        if (reader.getNextWord() == word_search[3]) {
                count3 = count3 + 1;
            }
        if (reader.getNextWord() == word_search[4]) {
                count4 = count4 + 1;
            }
        if (reader.getNextWord() == word_search[5]) {
                count5 = count5 + 1;
            }
        if (reader.getNextWord() == word_search[6]) {
                count6 = count6 + 1;
            }
        if (reader.getNextWord() == word_search[7]) {
                count7 = count7 + 1;
            }
        if (reader.getNextWord() == word_search[8]) {
                count8 = count8 + 1;
            }
        if (reader.getNextWord() == word_search[9]) {
                count9 = count9 + 1;
            }


    }


    cout << "Please enter the name of the file to write to: " << flush;

    char filename2[30];
    cin >> filename2;
    Writer reader2(filename2);
    cout << "File has been written too.." << endl;

    reader2.writeInt(count);
    reader2.writeString("Hello my name is Joshua Ogunnote");

    return 0;
}

This is a separate file where some of my functions are declared:

#include "ReadWords.h"
#include <cstring>
#include <iostream>
using namespace std;


void ReadWords::close(){
    wordfile.close();

}

ReadWords::ReadWords(const char *filename) {


        wordfile.open(filename);

        if (!wordfile) {
            cout << "could not open " << filename << endl;
            exit(1);
        }
}

string ReadWords::getNextWord() {

    string n;


    if(isNextWord()){
        wordfile >> n;


        int len = n.length();
        for(int i = 0; i < len ; i++) {


            if (ispunct(n[i]))

                    {
                        n.erase(i--, 1);
                        len = n.length();
                    }
        }
            cout << n << endl;
        return n;

    }
}


bool ReadWords::isNextWord() {

        if (wordfile.eof()) {
            return false;
        }
        return true;
}
jayoguntino
  • 133
  • 1
  • 7
  • Please use [a Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve) – Paul Evans Nov 15 '15 at 01:08
  • Whenever you have many variables with the same name but differing only by an id number, this is a hint you should use an array and loop. – Neil Kirk Nov 15 '15 at 01:12

1 Answers1

0

If you're just using English, a simple tolower() transform will do.

std::string tolower( std::string s )
{
  for (char& c : s) c = std::tolower( c );
  return s;
}

Now you can compare them:

if (tolower( "Hello" ) == tolower( "HELLO" ))

If you are working with Unicode, you should perform a conversion called case folding on the text, and compare the resulting string data.

Dúthomhas
  • 8,200
  • 2
  • 17
  • 39
  • yes that would work if i actually had the strings but i am getting my strings from my external file so I don't know how to apply your logic exactly – jayoguntino Nov 15 '15 at 01:09