word count problem

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • waynejr25
    New Member
    • Nov 2007
    • 3

    word count problem

    can anyone debug my program and get it to run.

    [CODE=cpp]#include <fstream>
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <map>

    using namespace std;



    string getInputFileNam e(); // a function to prompt for the complete file name

    int numCharsInFile( ifstream &in, int &numLines ); // a function to count the
    // number of characters and
    // lines in a text file

    int numWordsInFile( ifstream &in, int &numWords ); // a function to count words in file

    string get_tokenInFile ( ifstream &in, int &numWords ); // a function to count frequency of words in file



    main ()
    {


    char c;
    int nLines, // number of lines in the text file
    nChars, // number of characters in the text file
    avgCharsPerLine , // average number of characters per line
    nWords;
    string nWords1; // number of words in the text file



    ifstream inFile; // handle for the input text file

    string fileName; // complete file name including the path

    fileName = getInputFileNam e(); // prompt and obtain the full file name

    inFile.open(fil eName.c_str()); // try to open the file

    if( !inFile.is_open () ) // test for unsuccessfull file opening
    {
    cerr << "Cannot open file: " << fileName << endl << endl;
    exit (0);
    }


    nChars = numCharsInFile( inFile, nLines ); // determine the number of lines
    // and characters in the file
    nWords = numWordsInFile( inFile, nWords ); // determine the number of words

    nWords1 = get_tokenInFile ( inFile, nWords1 ); // determine the frequency of characters

    avgCharsPerLine = nChars / nLines;




    cout << "The number of characters in the file: " << fileName
    << " is = " << nChars << endl << endl;

    cout << "The number of lines in the file: " << fileName
    << " is = " << nLines << endl << endl;


    cout << "The number of Words in the file: " << fileName
    << " is = " << nWords << endl << endl;

    cout << "The average number of characters per line in the text file: "
    << fileName << " is: " << avgCharsPerLine << endl << endl;

    cout << "The frequency of Words in the file: " << fileName
    << " is = " << nWords1 << endl << endl;

    cin>>c;
    inFile.close(); // close the input file

    }



    string getInputFileNam e()
    {
    string fName; // fully qualified name of the file

    cout << "Please enter the fully qualified name of the " << endl
    << "input text file (i.e. including the path): ";
    cin >> fName; // cannot handle blanks in a file name or path
    cout << endl;

    return fName;
    }





    int numCharsInFile( ifstream &in, int &numLines )
    {
    int numChars = 0;

    char ch; // character holder;

    numLines = 0; // initialize the number of lines to zero

    while ( in.get(ch) ) // get the next character from the file
    // the function get will also get whitespace
    // i.e. blanks, tabs and end of line characters

    {
    if (ch != ' ' )
    {
    if(ch != '\n')
    numChars++;// increase the count of characters by one if ch is NOT '\n' AND NOT a blank space
    else
    {
    numLines++; // increase the count of lines by one if ch IS '\n'
    }
    }
    }
    numLines += 1; // for some reason it needs to add one and the results are correct
    return numChars; // return the number of characters in the file
    }




    int numWordsInFile( ifstream &in, int &nWords)
    {
    in.clear();

    in.seekg(0, ios_base::beg); // IS THIS CORRECT UBERGEEK?

    int numWords = 0 ;

    char ch;


    while (in.get(ch))
    {

    if ( ch == ' ' || ch == '\n' || ch == '\t' )
    numWords++;


    }

    return numWords+1; // for some reason again it needs to add one to work properly
    }

    string get_token( ifstream &in, string nWords1)
    {
    string token;

    char ch;

    while (in.get(ch))
    {
    char c;
    in.get(ch)>> c;
    if ( isalpha( c ) || c == '\'' )
    token += c;
    else if ( token.size() )
    return token;



    }
    return token;
    }
    string token = get_token( infile );
    if ( token.size() == 0 )
    break;
    map<string, int>::const_ite rator ii = frequency.find( token );
    if ( ii == frequency.end() )
    frequency[ token ] = 1;
    else
    frequency[ token ]++;

    multimap<int, string> counts;
    for ( map<string, int>::iterator ii = frequency.begin () ;
    ii != frequency.end() ;
    ii++ )
    counts.insert( pair<int,string >( (*ii).second, (*ii).first ) )

    set<string> used_codes;
    for ( multimap<int, string>::revers e_iterator jj = counts.rbegin() ;
    jj != counts.rend() ;
    jj++ )
    {
    string code = create_star_cod e( (*jj).second, used_codes );
    used_codes.inse rt( code );
    codes[ (*jj).second ] = code;
    cout <<(*jj).secon d <<" " <<code <<" " <<(*jj).first <<endl;
    }[/CODE]
    Last edited by Ganon11; Nov 7 '07, 11:15 PM. Reason: Please use the [CODE] tags provided.
  • scruggsy
    New Member
    • Mar 2007
    • 147

    #2
    Help us help you.
    Put your code in [ code ] tags and describe what problem you are having with this program.

    Comment

    • waynejr25
      New Member
      • Nov 2007
      • 3

      #3
      Originally posted by scruggsy
      Help us help you.
      Put your code in [ code ] tags and describe what problem you are having with this program.
      The code works but my last function to count the frequency of each word in a txt file is not working can you please help me i need this program to graduate.
      Last edited by sicarie; Nov 9 '07, 02:15 PM. Reason: Why post the same code again ignoring requests for code tags?

      Comment

      • scruggsy
        New Member
        • Mar 2007
        • 147

        #4
        Seriously:

        Originally posted by scruggsy
        Help us help you.
        Put your code in [ code ] tags and describe what problem you are having with this
        program.
        What, specifically, is happening when you try to run and/or compile this program? Compiler errors? Incorrect results?

        Look at your code in the [ code] [/code ] tags below (much easier to read that way, isn't it?)
        Code:
        #include <fstream>  
        #include <iostream> 
        #include <string>   
        #include <cstdlib>
        #include <map> 
         
        using namespace std; 
         
         
         
        string getInputFileName(); // a function to prompt for the complete file name
         
        int numCharsInFile( ifstream &in, int &numLines ); // a function to count the
                                                           //    number of characters and
                                                           //    lines in a text file
         
        int numWordsInFile( ifstream &in, int &numWords ); // a function to count words in file
         
        string get_tokenInFile( ifstream &in, int &numWords ); // a function to count frequency of words in file but this function isn't working
         
         
         
         main ()
        {
         
         
            char c;
          int nLines,          // number of lines in the text file
              nChars,          // number of characters in the text file
              avgCharsPerLine, // average number of characters per line
              nWords;
          string nWords1;          // number of words in the text file
         
         
         
          ifstream inFile; // handle for the input text file
         
          string fileName; // complete file name including the path
         
          fileName = getInputFileName(); // prompt and obtain the full file name
         
          inFile.open(fileName.c_str()); // try to open the file
         
          if( !inFile.is_open() )    // test for unsuccessfull file opening
           {
             cerr << "Cannot open file: " << fileName << endl << endl;
             exit (0);
           }
         
         
          nChars = numCharsInFile( inFile, nLines ); // determine the number of lines
                                                    //    and characters in the file
          nWords = numWordsInFile( inFile, nWords ); // determine the number of words
          
          nWords1 = get_tokenInFile( inFile, nWords1 ); // determine the frequency of characters
          
          avgCharsPerLine = nChars / nLines;
         
            
         
          
          cout << "The number of characters in the file: " << fileName
               << " is = " << nChars << endl << endl;
          
          cout << "The number of lines in the file: " << fileName
               << " is = " << nLines << endl << endl;
         
         
          cout << "The number of Words in the file: " << fileName
               << " is = " << nWords << endl << endl;
         
          cout << "The average number of characters per line in the text file: "
               << fileName << " is: " << avgCharsPerLine << endl << endl;
         
          cout << "The frequency of Words in the file: " << fileName
               << " is = " << nWords1 << endl << endl;
         
            cin>>c;
          inFile.close(); // close the input file
         
        }
         
         
         
        string getInputFileName()
         {
           string fName; // fully qualified name of the file
         
           cout << "Please enter the fully qualified name of the " << endl
                << "input text file (i.e. including the path): ";
           cin >> fName; // cannot handle blanks in a file name or path
           cout << endl; 
         
           return fName;
         }
         
         
         
         
         
        int numCharsInFile( ifstream &in, int &numLines )
         {
           int numChars = 0; 
         
           char ch; // character holder;
         
           numLines = 0; // initialize the number of lines to zero
         
           while ( in.get(ch) ) // get the next character from the file
                                //   the function get will also get whitespace
                                //   i.e. blanks, tabs and end of line characters
         
            {
             if (ch != ' ' )
             {
               if(ch != '\n')
               numChars++;// increase the count of characters by one if ch is NOT '\n' AND NOT a blank space
               else
               {
               numLines++;     // increase the count of lines by one if ch IS '\n'
               }
             } 
            }
            numLines += 1; // for some reason it needs to add one and the results are correct
           return numChars; // return the number of characters in the file
         }
         
         
         
         
        int numWordsInFile( ifstream &in, int &nWords)
         {
            in.clear();
         
            in.seekg(0, ios_base::beg); // IS THIS CORRECT UBERGEEK?
            
            int numWords = 0 ; 
         
           char ch; 
         
           
           while (in.get(ch)) 
           {      
               
            if ( ch == ' ' || ch == '\n' || ch == '\t' ) 
               numWords++;    
                 
                               
            }
         
           return numWords+1; // for some reason again it needs to add one to work properly
         }  
         
          string get_token( ifstream &in, string nWords1) //this is where i'm having the problems
        {
            string token;
         
            char ch;
         
            while (in.get(ch))
            {
                char c;
                in.get(ch)>> c;
                if ( isalpha( c ) || c == '\'' )
                    token += c;
                else if ( token.size() )
                return token;
         
         
         
            }
            return token;
        }
        string token = get_token( infile );
            if ( token.size() == 0 )
                break;
            map<string, int>::const_iterator ii = frequency.find( token );
            if ( ii == frequency.end() )
                frequency[ token ] = 1;
            else
                frequency[ token ]++;
         
            multimap<int, string> counts;
            for ( map<string, int>::iterator ii = frequency.begin() ; 
                  ii != frequency.end();
                  ii++ )
              counts.insert( pair<int,string>( (*ii).second, (*ii).first ) )
              
        set<string> used_codes;
        for ( multimap<int, string>::reverse_iterator jj = counts.rbegin() ; 
              jj != counts.rend() ; 
              jj++ )
        {
          string code = create_star_code( (*jj).second, used_codes );
          used_codes.insert( code );
          codes[ (*jj).second ] = code;
          cout <<(*jj).second <<" " <<code <<" " <<(*jj).first <<endl;
        }
        get_token() ends at the closing brace immediately following return token. All the code beyond that brace is outside of any function. Surely that's not what you want?

        Comment

        Working...