954,506 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Reading from file, passing into function.

Hello All, well this is my first post after a while of inactivity.

I have run into a problem. I have an assignment for school, but when I debug my program using Dev C++(BloodShed) it give me a segmentation fault.

I am reading from a file that looks like this:

0001:Satriani:Joe:6:38.0
0002:Vai:Steve:1:44.5
0003:Morse:Steve:10:50.0
0004:Van Halen:Eddie:3:25.75
0005:Petrucci:John:8:42.25
0006:Beck:Jeff:3:62.0

i read from the file using this:

fscanf(in, "%[^:]:%[ ^:]:%[ ^:]:%d:%lf", empNum, lName, fName, &pGrp, &hrsWorked);

* Not Sure weather this is causing the problem or not.

I have an array that contains pay rates.

I want to do this:

rate = payRates[pGrp-1];

While debugging it gives me a segmentation fault error and high lites this line. Is it possible to do what I want to do? If it is not is there a way that I can achieve the same result?

Thank You,

Edouard

edouard89
Junior Poster in Training
53 posts since Feb 2007
Reputation Points: 10
Solved Threads: 2
 

OK it seems to me I have a problem with reading the file.
I hard coded some values to be passed into the calc_gross_to_pay() function and when I output to file it looks like this:

Emp# Last Name    First Name        Gross Pay         LTB          EI         
0001   ÿ"           X                  455.00        9.10        6.37              
Satr   ÿ"           X                  455.00        9.10        6.37              
iani   ÿ"           X                  455.00        9.10        6.37             
Joe    ÿ"           X                  455.00        9.10        6.37              
6      ÿ"           X                  455.00        9.10        6.37


* I have removed the last 4 columns due to formatting of the page*

As you can see the data in the Emp# column is from the first line of the data file that I was trying to read. Is there anything I can do to fix the problem in reading the data?

Here is my code for reading and out puting the data to a file.

main()
{    
    FILE *in;
    FILE *out;

    double payRates[NUMRATES];      
    int i, iMax = 0, iTotEmp;      
    char empNum[5];                 
    char lName[13];                 
    char fName[13];                 
    char lineC[50];                 
    int pGrp;                       
    double hrsWorked;               
    double grossPay, LTB, EI, CPP, FT, ded, netPay, junk, tNetPay, tGrossPay;

    get_PR(payRates);   
    in = fopen("employees.dat", "r");
    if(in == NULL)
    {
        printf("Error! Cant find the file employees.dat!\n");
        exit(1);
    }
   
    fgets(lineC, sizeof(lineC) - 1 ,in);
                                   
    while (! feof(in))
    {
        iMax++;
        fgets(lineC, sizeof(lineC) - 1 ,in);
    }
    rewind(in);                                 
    out = fopen("payroll.dat", "w");
    if(in == NULL)
    {
        printf("Error! Cant find the file payroll.dat!\n");
        exit(1);
    }
    else                          
    {
        fprintf(out, "Emp# Last Name    First Name        Gross Pay         LTB          EI         CPP          FT  Deductions     Net Pay\n");
    }    

    for(i = 0; i<iMax;i++)       
    {
        fscanf(in, "%4[^:]:%12[ ^:]:%12[ ^:]:%d:%lf\n", empNum, lName, fName, &pGrp, &hrsWorked);
 
        grossPay = calc_gross_ot_pay(PRATE, HRSWRKED);
        //PRATE and HRSWRKED are defined using #define
        LTB = calc_LTB(grossPay);
        EI = calc_EI(grossPay);
        CPP = calc_CPP(grossPay);
        FT = calc_FT(grossPay);
        ded = LTB + EI + CPP + FT;
        netPay = grossPay - ded;
        tNetPay += netPay;
        tGrossPay +=grossPay;
        fprintf(out, "%-5s %-13s %-13s %11.2lf %11.2lf %11.2lf %11.2lf %11.2lf %11.2lf %11.2lf\n", empNum, lName, fName, grossPay, LTB, EI, CPP, FT, ded, netPay);
    }
    printf("# of employees: %d Total Net Pay %lf Total Gross Pay %lf", iMax, tNetPay, tGrossPay);

    fclose(out);
    fclose(in);
    return 1;
}
edouard89
Junior Poster in Training
53 posts since Feb 2007
Reputation Points: 10
Solved Threads: 2
 

i read from the file using this:

fscanf(in, "%[^:]:%[ ^:]:%[ ^:]:%d:%lf", empNum, lName, fName, &pGrp, &hrsWorked);

I tested this and it works: fscanf(in, "%[^:]:%[a-zA-Z0-9]:%[a-zA-Z0-9]:%d:%lf", empNum, lName, fName, &pGrp, &hrsWorked)

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

The SPACEs in the scanset seem to be the problem. Remove them and see if that works for you.

Also, check out this information on
main()
while (! feof(in))

And what is the purpose of reading the file first? Just read it once.
I would also suggest rather than using fscanf() you switch to fgets()/sscanf() combo. If an error occurs with fscanf() it's harder to recover.

WaltP
Posting Sage w/ dash of thyme
Moderator
10,506 posts since May 2006
Reputation Points: 3,348
Solved Threads: 944
 

Thanks a lot for the help you have both given me!

It was a space problem and the way I was getting the Last and First Name.
I changed my scanf code to this and it works flawlessly:

fscanf(in, "%[^:]:%[a-zA-Z a-zA-Z]:%[a-zA-Z]:%d:%lf\n", &empNum, &lName, &fName, &pGrp, &hrsWorked);

I also used the

while(!=feof(in))


you had suggested, the reason I was reading it twice was to find the length but using your suggestion I just added a counter to get over that and just read it once.

Once Again thank you both for your input.:)

Now its just a matter of tweaking some functions to get the correct output values.

edouard89
Junior Poster in Training
53 posts since Feb 2007
Reputation Points: 10
Solved Threads: 2
 

Wow now in Unix it gives me a Syntax Error when I try to compile it...

Is there anything wrong with this?

void get_PR(double rates[]);        //Used to get pay rates and populates array.


Its right at the begining of the C source file:

#include <stdio.h>

void get_PR(double rates[]);        //Used to get pay rates and populates array.
double calc_gross_ot_pay(double pRate, double hrsWrk); 
				    //Used to calculate gross pay of employee.
double calc_LTB(double gross_pay);  //Used to calculate Long Term Benefits.
double calc_EI(double gross_pay);   //Used to calculate Employee Insurance.
double calc_CPP(double gross_pay);  //Used to calculate Canadian Pension Plan.
double calc_FT(double gross_pay);   //Used to calculate Fed. & Prov. Taxes.

int main()
{
edouard89
Junior Poster in Training
53 posts since Feb 2007
Reputation Points: 10
Solved Threads: 2
 

Looks ok to me. What compiler and what is the error message?

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

I'm not sure which compiler, because I am remotely connecting to my school and using Unix from there. But it gives me a syntax error when I attempt to compile it.

*EDIT* I think its this:

VisualAge C++ Professional / C for AIX Compiler, Version 5

edouard89
Junior Poster in Training
53 posts since Feb 2007
Reputation Points: 10
Solved Threads: 2
 

The AIX native C compiler does not like the // comment style for .c files, since its considers it a C++ comment and not a C style comment. I think that is probably the reason you're getting the errors and you will either need to change it to the /* */ comment style or using the compile flag -qcpluscmt.

See if that helps.

stilllearning
Posting Whiz
309 posts since Oct 2007
Reputation Points: 161
Solved Threads: 43
 

Wow that was it... the comments...god...

Thanks A lot for that response!

edouard89
Junior Poster in Training
53 posts since Feb 2007
Reputation Points: 10
Solved Threads: 2
 

I also used the

while(!=feof(in))
you had suggested, the reason I was reading it twice was to find the length but using your suggestion I just added a counter to get over that and just read it once.


I wouldnever suggest while(!=feof(in)) !!! See this and you'll see why.

WaltP
Posting Sage w/ dash of thyme
Moderator
10,506 posts since May 2006
Reputation Points: 3,348
Solved Threads: 944
 

I guess I mis read what you posted I will make the adjustment to my code as to not encounter that error.

edouard89
Junior Poster in Training
53 posts since Feb 2007
Reputation Points: 10
Solved Threads: 2
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You