Reputation: 9
I'm able to get the program to open the file, but I'm having trouble getting it to read the information. It needs to run the data line by line, but it keeps getting caught by my "Error reading data" loop. How can I fix this?
#include <stdio.h>
#include <stdlib.h>
int getdata(FILE *data, int *empid, int *dept, float *paygr, int *exe, int *hours);
void calcdata(float paygr, int exe, int hours, float *pay, float *overpay, float *tpay);
void printdata(int empid, int dept, float paygr, int exe, int hours, float pay, float overpay, float tpay);
int main(void)
{
FILE *data;
int empid;
int dept;
float paygr;
int exe;
int hours;
float pay;
float overpay;
float tpay;
data = fopen("emp_data.txt", "r");
if (data == NULL)
{
printf("Could not open input file\a\n");
exit(101);
}
while (getdata(data, &empid, &dept, &paygr, &exe, &hours))
{
calcdata(paygr, exe, hours, &pay, &overpay, &tpay);
printdata(empid, dept, paygr, exe, hours, pay, overpay, tpay);
}
fclose(data);
return 0;
}
int getdata(FILE *data, int* empid, int* dept, float *paygr, int *exe, int *hours)
{
int ioResult;
ioResult = fscanf(data, "%d%d%f%d%d", empid, dept, paygr, exe, hours);
if (ioResult == EOF)
{
return 0;
}
else if (ioResult != 5)
{
printf("\aError reading data\n");
return 0;
}
else
{
return 1;
}
}
void calcdata(float paygr, int exe, int hours, float *pay, float *overpay, float *tpay)
{
int overhrs;
if (exe == 'N' && hours > 40)
{
overhrs = hours - 40;
*tpay = (paygr * (hours - overhrs)) + (overhrs * (paygr * 1.5));
*pay = (hours - overhrs) * paygr;
*overpay = (overhrs * (paygr * 1.5));
}
else
{
*tpay = hours * paygr;
*pay = hours * paygr;
*overpay = 0.0;
}
}
void printdata(int empid, int dept, float paygr, int exe, int hours, float pay, float overpay, float tpay)
{
printf("%d %d %2f %d %d %2f %2f %2f\n", empid, dept, paygr, exe, hours, pay, overpay, tpay);
}
Here's the text from emp_data.txt
205 14 7.54 N 45
3498 64 17.98 Y 38
1328 38 25.75 Y 49
9054 76 10.43 N 42
213 64 8.29 N 47
659 14 7.52 N 41
5487 14 25.75 Y 52
4326 38 7.54 N 36
1267 76 8.29 N 40
Upvotes: 0
Views: 132
Reputation: 352
If you still have problems reading the file -supposing you give the correct file path at fopen(... ), try the following complete code
#include <stdio.h>
#include <stdlib.h>
int getdata(FILE *data, int *empid, int *dept, float *paygr, char
*exer,int *hours);
void calcdata(float paygr, char *exer, int hours, float *pay, float
*overpay, float *tpay);
void printdata(int empid, int dept, float paygr, char *exer, int hours,
float pay, float overpay, float tpay);
int main(void) {
FILE *data;
int empid;
int dept;
float paygr;
char exea[2];
int hours;
float pay;
float overpay;
float tpay;
int ioresult;
data = fopen("emp_data.txt", "r");
if (data == NULL) {
printf("Could not open input file\a\n");
exit(101);
}
while (getdata(data, &empid, &dept, &paygr, &exea[0], &hours)) {
calcdata(paygr, &exea[0], hours, &pay, &overpay, &tpay);
printdata(empid, dept, paygr, &exea[0], hours, pay, overpay, tpay);
}
fclose(data);
return 0;
}
int getdata(FILE *data, int* empid, int* dept, float *paygr, char *exer,
int *hours) {
int ioResult;
ioResult = fscanf(data,"%d%d%f%s%d",empid,dept,paygr,exer,hours);
if (ioResult == EOF) {
return 0;
} else
if (ioResult != 5) {
printf("\aError reading data\n");
return 0;
} else {
return 1;
}
}
void calcdata(float paygr, char *exer, int hours, float *pay, float
*overpay, float *tpay) {
int overhrs;
if (exer[0] == 'N' || hours > 40) {
overhrs = hours - 40;
*tpay = (paygr * (hours - overhrs)) + (overhrs * (paygr * 1.5));
*pay = (hours - overhrs) * paygr;
*overpay = (overhrs * (paygr * 1.5));
} else {
*tpay = hours * paygr;
*pay = hours * paygr;
*overpay = 0.0;
}
}
void printdata(int empid, int dept, float paygr, char *exer, int hours,
float pay, float overpay, float tpay) {
printf("%d %d %f %s %d %f %f %f\n",empid, dept, paygr, exer,
hours,pay,overpay,tpay);
}
That will work.
Upvotes: 0
Reputation: 144740
Here are some problems in your code:
The variables should be made local in the main
function.
testing !data
and data == NULL
is redundant: both expressions are equivalent.
The employee status is a character, it should be parsed with a %c
format into a char
variable
you should pass values to printf
instead of addresses.
you should pass the data printdata
by value too, passing the addresses is unneeded.
input arguments in calcpay should be passed by value. Only output variables need be passed by address.
you must set overpay
to 0.0
if there is no overtime, otherwise it in uninitialized or keeps the value from the previous employee.
Printing floats value representing money should be done with 2 decimal places, not the default 6. Due to the lack of precision of the type, you could end up with 123456.799999
instead of 123456.80
.
the linefeed character is represented as \n
, not /n
fscanf()
ignores white space when reading values, but you should separate the values when printing them.
The number of conversion specifiers does not match the number of arguments to printf
. Compile with warnings enabled to let the compiler detect these silly mistakes.
Here is how to correct the code:
#include <stdio.h>
#include <stdlib.h>
int getdata(FILE *data, int *empid, int *dept, float *paygr, int *exe, int *hours);
void calcdata(float paygr, int exe, int hours, float *pay, float *overpay, float *tpay);
void printdata(int empid, int dept, float paygr, int exe, int hours, float pay, float overpay, float tpay);
int main(void) {
FILE *data;
int empid;
int dept;
float paygr;
char exe;
int hours;
float pay;
float overpay;
float tpay;
data = fopen("emp_data.txt", "r");
if (data == NULL) {
printf("Could not open input file\a\n");
exit(101);
}
while (getdata(data, &empid, &dept, &paygr, &exe, &hours)) {
calcdata(paygr, exe, hours, &pay, &overpay, &tpay);
printdata(empid, dept, paygr, exe, hours, pay, overpay, tpay);
}
fclose(data);
return 0;
}
int getdata(FILE *data, int* empid, int* dept, float *paygr, char *exe, int *hours) {
int ioResult;
ioResult = fscanf(data, "%d%d%f %c%d", &empid, &dept, &paygr, &exe, &hours);
if (ioResult == EOF) {
return 0;
} else
if (ioResult != 5) {
printf("\aError reading data\n");
return 0;
} else {
return 1;
}
}
void calcdata(float paygr, char exe, int hours, float *pay, float *overpay, float *tpay) {
int overhrs;
if (exe == 'N' || hours > 40) {
overhrs = hours - 40;
*tpay = (paygr * (hours - overhrs)) + (overhrs * (paygr * 1.5));
*pay = (hours - overhrs) * paygr;
*overpay = (overhrs * (paygr * 1.5));
} else {
*tpay = hours * paygr;
*pay = hours * paygr;
*overpay = 0.0;
}
}
void printdata(int empid, int dept, float paygr, char exe, int hours,
float pay, float overpay, float tpay) {
printf("%d %d %2f %c %d %2f %2f %2f\n",
empid, dept, paygr, exe, hours, pay, overpay, tpay);
}
Upvotes: 1