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]
[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]
Comment