01: #include <iostream>
02: #include <iomanip>
03: #include <fstream>
04: #include <sstream>
06: using namespace std;
07: 
08: #include "ccc_empl.cpp"
09: 
10: const int NEWLINE_LENGTH = 2; /* 2 for Windows or 1 on Unix */
11: const int RECORD_SIZE = 30 + 10 + NEWLINE_LENGTH;
13: /** 
14:    Converts a string to a floating-point value, e.g. 
15:    "3.14" -> 3.14.
16:    @param s a string representing a floating-point value
17:    @return the equivalent floating-point value
18: */   
19: double string_to_double(string s) 20: { istringstream instr(s); 22: double x; 23: instr >> x; 24: return x; 25: } 27: /** 28: Raises an employee salary. 29: @param e employee receiving raise 30: @param percent the percentage of the raise 31: */ 32: void raise_salary(Employee& e, double percent) 33: { double new_salary = e.get_salary() * (1 + percent / 100); 35: e.set_salary(new_salary); 36: } 38: /** 39: Reads an employee record from a file. 40: @param e filled with the employee 41: @param in the stream to read from 42: */ 43: void read_employee(Employee& e, istream& in) 44: { string line; 46: getline(in, line); 47: if (in.fail()) return; 48: string name = line.substr(0, 30); 49: double salary = string_to_double(line.substr(30, 10)); 50: e = Employee(name, salary); 51: } 53: /** 54: Writes an employee record to a stream 55: @param e the employee record to write 56: @param out the stream to write to 57: */ 58: void write_employee(Employee e, ostream& out) 59: { out << e.get_name() 61: << setw(10 + (30 - e.get_name().length())) 62: << fixed << setprecision(2) 63: << e.get_salary() << "\n"; 65: } 67: int main() 68: { cout << "Please enter the data file name: "; 70: string filename; 71: cin >> filename; 72: fstream fs; 73: fs.open(filename.c_str()); 74: fs.seekg(0, ios::end); /* go to end of file */ 75: int nrecord = fs.tellg() / RECORD_SIZE; 76: 77: cout << "Please enter the record to update: (0 - " 78: << nrecord - 1 << ") "; 79: int pos; 80: cin >> pos; 81: 82: const double SALARY_CHANGE = 5.0; 83: 84: Employee e; 85: fs.seekg(pos * RECORD_SIZE, ios::beg); 86: read_employee(e, fs); 87: raise_salary(e, SALARY_CHANGE); 88: fs.seekp(pos * RECORD_SIZE, ios::beg); 89: write_employee(e, fs); 90: 91: fs.close(); 92: return 0; 93: }