2

My assignment states the following :

Three employees in a company are up for a special pay increase. You are given a file, Ch3_Ex7Data.txt, with the following data:

Miller Andrew 65789.87 5
Green Sheila 75892.56 6
Sethi Amit 74900.50 6.1

Each input line consists of an employee's last name, first name, current salary, and percent pay increase.

For example, in the first input line, the last name of the employee is Miller, the first name is Andrew, the current salary is 65789.87, and the pay increase is 5 %.

Write a program that reads data from the specified file and stores the output in the file Ch3_Ex7Output.dat. For each employee, the data must be output in the following form:
firstName lastName updatedSalary
Format the output of decimal numbers to two decimal places.

My code is the following.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;

int main()
{
    //Declaring the variables
    string firstName;
    string lastName;
    double payIncrease;
    double pay;
    ifstream inFile;
    ofstream outFile;

    inFile.open("C:\\Users\\Megan\\Ch3_Ex7Data.txt"); //opens the input file
    outFile.open("C:\\Users\\Megan\\Ch3_Ex7Output.dat"); //opens a output file

    outFile << fixed << showpoint;
    outFile << setprecision(2); // Output file only having two decimal places
    cout << "Processing Data....." endl;  //program message

    while (!inFile.eof() //loop
        inFile >> lastName >> firstName >> pay >> payIncrease;
        pay = pay*(pay*payIncrease);
        outFile << firstName << " " << lastName << " " << pay << "/n";

    inFile.close();
    outFile.close();

    return 0;
}

For some reason I cannot seem to get the code to open my existing .txt file, read it and then translate it to another file. Does anybody see anything wrong with this that could help me out?

Community
  • 1
  • 1
Megan
  • 29
  • 1
  • 2
  • 2
    Start by actually validating your IO operations, not that this code compiles in the first place (you're missing a closing `)` on the while-condition, [which is also wrong](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)). There also appears to be a distinctly-missing set of `{}` for what appears to be the body of your `while` loop. – WhozCraig Mar 13 '16 at 17:50
  • Without the set of `{ }`, the contents of the `while` loop will be the first statement, which is reading the variables many times and not processing them. – Thomas Matthews Mar 13 '16 at 18:16
  • This code does not even compile! When asking for help you should try to show your current code after fixing trivial errors (missing `)` and `< – Serge Ballesta Mar 13 '16 at 18:46
  • `while (!inFile.eof() //loop` o.O – Lightness Races in Orbit Mar 13 '16 at 19:04

2 Answers2

1

You have many problems with you code.

The two most evident prevent the program from compiling:

cout << "Processing Data....." endl;  //program message

should be:

cout << "Processing Data....." << endl;  //program message

and while (!inFile.eof() //loop should be at least while (!inFile.eof() )//loop

That's not all:

while (!inFile.eof()) is an anti-idiom: you test for end of file, then read and do the processing even if an error or end of file has occured. You must test after reading.

And as you were said in comment, without { } only the first line after the while is repeated, which is not what you want.

The correct formula to add a percent increase is pay = pay*(1 + payIncrease/100.); at least pay = pay+(pay*payIncrease/100.);

Adding a '/n' as an end of line is plain wrong. The character is '\n' (note the backslash), and anyway you should always write endl in C++.

Once all that is fixed, the loop becomes:

for (;;) { //loop
    inFile >> lastName >> firstName >> pay >> payIncrease;
    if (! inFile) break; // exit on eof or error
    pay = pay*(1 + payIncrease/100.);
    outFile << firstName << " " << lastName << " " << pay << endl;
}

and the output is:

Andrew Miller 69079.36
Sheila Green 80446.11
Amit Sethi 79469.43

But is you want to learn good pratices, you should also:

  • test the opening of both files
  • test after end of loop if the termination was caused by an error and issue a warning
  • last by not least learn to use a debugger...
Serge Ballesta
  • 121,548
  • 10
  • 94
  • 199
0

This was my solution

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

int main() {
    // Write your main here
    //Declarations
    string FirstName;
    string LastName;
    double Pay;
    double Increase;
    double UpdatedSalery;

    //File object and open txt and dat files per instructions and use user input for    the txt input file
    ifstream FileIn;
    string FileName;
    cout << "enter a file name: ";
    cin >> FileName;
    FileIn.open(FileName);

    ofstream FileOut("Ch3_Ex5Output.dat");
    FileOut << setprecision(8);

    while(FileIn >> LastName >> FirstName >> Pay >> Increase){
        UpdatedSalery = ((Pay*(Increase/100))+Pay);
        FileOut << " " << FirstName << " " << LastName << " " << UpdatedSalery << endl;
    }
    FileIn.close();
    FileOut.close();
    return 0;
}
Jimmy
  • 1
  • Could you elaborate on the code? How does it work? What are the key functions? As a reference have a look at the answer by [Serge Ballesta](https://stackoverflow.com/a/35974604/12892553) – Nimantha Jun 01 '20 at 03:50