954,492 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Missing output from program

The following program executes without any errors, but the output is not what is expected. The code is correct down till the opening of the MarkScheme.txt file, but the student mark is not displayed on the screen, any thoughts

#include <cstdlib>							
#include <fstream>						
#include <iostream>
#include <cstring>
#include <string>

using namespace std;																	
int main()
{
	cout << "	Marking Program		";			//Start of program

	string username;

	cout << "Enter Students Username:";		
	cin >> username;
	
	string filename = username + ".txt";
    ifstream file(filename.c_str());
	if (!file) {
    cerr<<"Username not found"<<endl;		
    return EXIT_FAILURE;					
	}
		
	{ ifstream in("MarkScheme.txt");		
	if (!in){
	cerr<<"Mark Scheme not found"<<endl;	
	return EXIT_FAILURE;
	}
	}
              //beginning of section of code not working 
	string search;
	int count(0);
    if (!getline(cin, search)) {			
		count;
  }

	string line;
	while (getline(cin, line)) {
    if (line.find(search) == string::npos)	
      ++count;
  }

  cout<< "students mark is"<<count<<"out of 10"<<endl;	

  return EXIT_SUCCESS;									
}
jonnie83
Newbie Poster
24 posts since Feb 2005
Reputation Points: 10
Solved Threads: 0
 
if (!getline(cin, search)) {			
  count;
}

If getline fails, you basically do nothing here. You're reading the value of count (0) and doing nothing with it.

{ ifstream in("MarkScheme.txt");		
  if (!in){
    cerr<<"Mark Scheme not found"<<endl;	
    return EXIT_FAILURE;
  }
} // End local

This also does practically nothing. Because the definition of in is inside braces, it's local to that block. When you get to the "End local" comment, it's destroyed. I can imagine that you wanted to use in for later input, but had to change it to cin because the compiler said in didn't exist.

I have no idea what you want your code to do, so I can't give you an improved version.

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

What i want the code to do is open the mark scheme file. In that is 10 strings. I want to see if these strings are present in the file opened at the beginning of the code. Every string found I want the counter to be incremented and once the final string has been searched for I want the value of the counter displayed to the operator

jonnie83
Newbie Poster
24 posts since Feb 2005
Reputation Points: 10
Solved Threads: 0
 

A naive implementation would look something like this:

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

using namespace std;

int main()
{
  string line;

  cout<<"Enter a file to open: ";
  getline ( cin, line );

  ifstream in ( line.c_str() );

  if ( in ) {
    int count = 0;

    while ( getline ( in, line ) ) {
      ifstream markstream ( "MarkScheme.txt" );
      string mark;

      while ( getline ( markstream, mark ) ) {
        if ( mark == line )
          ++count;
      }
    }

    cout<<"The total count is "<< count <<endl;
  }
}

A better implementation would look more like this:

#include <fstream>
#include <iostream>
#include <set>
#include <string>

using namespace std;

set<string> load_file ( const string& filename )
{
  ifstream in ( filename.c_str() );

  if ( !in )
    return set<string>();

  string line;
  set<string> ret;

  while ( getline ( in, line ) )
    ret.insert ( line );

  return ret;
}

int main()
{
  string filename;

  cout<<"Enter a file to open: ";
  getline ( cin, filename );

  set<string> user = load_file ( filename );
  set<string> mark = load_file ( "MarkScheme.txt" );
  int count = 0;

  for ( set<string>::const_iterator it = user.begin(); it != user.end(); ++it ) {
    if ( mark.find ( *it ) != mark.end() )
      ++count;
  }

  cout<<"The total count is "<< count <<endl;
}

And there would be degrees of improvement as you went away from the manual version to an even more abstracted version. ;)

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

I have tried both recommended programs but all the final count always displays as 0. How should the markscheme.txt file be set up, is this the problem?

jonnie83
Newbie Poster
24 posts since Feb 2005
Reputation Points: 10
Solved Threads: 0
 

>I have tried both recommended programs
Both recommended programs were suggestions to get you started. Naturally, you would need to modify them to suit your needs. For example, if you wanted to do a substring search then comparison with == will most likely not do what you want. In that case you would probably use the find member function of the string class:

if ( mark.find ( line ) != string::npos )
  ++count;
Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You