1

When i go to print my array it prints, but there is extra data at the end. The Extra Data is one line after the last line of output that should be there. it contains:" -13096448" (note, it starts with a space.)

/***************************************************/
/* Author:     Sam LaManna                         */
/* Course:                                         */
/* Assignment: Program 6 Elves                     */
/* Due Date:   12/9/11                            */
/* Filename:   program6.cpp                        */
/* Purpose:    Write a program that will process   */
/*             the work done by santas elfs        */
/***************************************************/

#include <iostream>     //Basic input/output
#include <iomanip>      //Manipulators
#include <string>       //String stuff 
#include <fstream>      //File input/output

using namespace std;

void instruct ();     //Function Declaration for printing instructions 
void input (ifstream &infile, string &names, int &numoftoys);    //Function declaration for getting data from file
void headers ();     //Prints headers

int main()
{

  string names [50];       //Array for storing names
  int numoftoys [50];      //Array for storing the number of toys made
  int i = 0;
  int p = 0;

  ifstream infile("elves.dat"); //Opens input file "elves.dat"

  instruct();     //Function call to print instructions

  while (!infile.eof())
    {
      input (infile, names[i] , numoftoys[i]);
      ++i;
    }

  for (int p = 0; p<i; p++)
    {
      cout << names[p] << " " << numoftoys[p] << "\n";
    }



  return 0;
}




/***************************************************/
/* Name: instruct                                  */
/* Description: Prints instructions to user        */
/* Parameters: N/A                                 */
/* Return Value: N/A                               */
/***************************************************/

void instruct ()                                   
{
  cout << "\n" << "This program will calculate the toys made by santas elfs and assign" << "\n";
  cout << "a rating to each elf. It will also sort them and print average, min and max." << "\n";
  cout << "\n" << "Make sure you have a file named elves.dat in the same directory as";
  cout << " this porgram or you will recieve errors.";
  cout << "\n" << "\n";

  return;
}


/***************************************************/
/* Name: input                                     */
/* Description: Reads from file                    */
/* Parameters: N/A                                 */
/* Return Value: N/A                               */
/***************************************************/

void input (ifstream &infile, string &names, int &numoftoys)
{
  infile >> names;
  infile >> numoftoys;
  //  infile.ignore ('\n');

  return;
}

Data File:

Smiley 662
Curley 88
Clementine 335
Jasper 105
Lucinda 775
Brunhilda 103
Florence 441
Oskar 820
Snowflake 990
Bernard 690
Punch 298
Chuckie 10
Frosty 102
Snowman 311
April 830
Merry 299
Sunshine 331
Buddy 1234
Carol 271
Misty 111
Harold 52
Henry 292
Twinkle 308
Starlight 703
Burr 112
Angelica 444
Bluenose 689
Harry 254
Twinkle 259
Stardust 121
Greensleeves 453
Noel 312
Happy 209
Yukon 534
Snowcap 190
Northpole 598
Sam LaManna
  • 425
  • 2
  • 7
  • 15
  • 1
    What type of file is it? What do the contents of the file look like, if opened in Notepad? – Jim Fell Dec 08 '11 at 16:12
  • You should print i final value, and compare it to the number of lines you expect to be read. Basically for an empty file, you would go through your reading loop once and i would be one, and thus go through the outpout loop once (but no data was read). Quick fix : second loop stop condition could be p<(i-1). – Ad N Dec 08 '11 at 16:17
  • Don't loop `while(!f.eof())`. That's pretty much always the wrong way to do it. http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – R. Martinho Fernandes Dec 08 '11 at 16:20

2 Answers2

1

check if the conversion succeeds.

bool input (ifstream &infile, string &names, int &numoftoys)
{
  infile >> names;
  if (infile.fail()) return false;
  infile >> numoftoys;
  if (infile.fail()) return false;
  return true;
}

so you can use it like:

if (input(...)) { /* valid data */ }
perreal
  • 94,503
  • 21
  • 155
  • 181
1

There are multiple problems with the input loop. It should probably read something like the following:

while ((infile >> names[i]) && (infile >> numoftoys[i]))
{
      ++i;
}

This avoids processing an extra line when the input fails and when there is a blank line at the end of the file (in which case the final .eof() test would succeed and input(...) would fail while still incrementing i.

André Caron
  • 44,541
  • 12
  • 67
  • 125