Reading .txt file into C program

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

Answers (2)

SteveTheGrk
SteveTheGrk

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

chqrlie
chqrlie

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

Related Questions