2016-11-04 90 views
0

我能够让程序打开该文件,但我无法读取该信息。它需要逐行运行数据,但它一直被我的“错误读取数据”循环所捕获。我怎样才能解决这个问题?将.txt文件读入C程序

#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); 
} 

下面是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 
+2

@LPs:可能带有嵌入空格;-) – chqrlie

+0

显示emp_data.txt文件。 – BLUEPIXY

+1

'scanf'是错误的。你有指针传递函数:'fscanf(data,“%d%d%f%d%d”,&empid,&dept,&paygr,&exe,&hours);' - >'fscanf(data,“%d% d'f%d%d“,empid,dept,paygr,exe,小时);' – LPs

回答

1

这里是你的代码的一些问题文本:

  • 的变量应在main函数的局部。

  • 测试!datadata == NULL是多余的:两个表达式都是等价的。

  • 员工状态是一个字符,它应该有一个%c格式解析成char变量

  • 你应该值传递给printf,而不是地址。

  • 你也应该通过数据printdata数据太传递地址是不需要的。

  • calcpay中的输入参数应该按值传递。只有输出变量需要通过地址传递。

  • 如果没有超时时间,则必须将overpay设置为0.0,否则将在未初始化或保留之前员工的值。

  • 打印浮动值代表金钱应该使用2位小数,而不是默认值6.由于缺少类型的精度,您可能会以123456.799999而不是123456.80结束。

  • 换行符表示为\n,不/n

  • fscanf()读值时,忽略空格,但在打印时你应该如何分开的值。

  • 转换说明符的数量与printf的参数数量不匹配。编译启用警告,让编译器检测这些愚蠢的错误。

这里是如何纠正代码:

#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); 
} 
+1

@LPs:很好!添加和修复。 – chqrlie

+0

谢谢,这有很大的帮助。不过,我仍然遇到和以前一样的问题,它不会从文件中读取数据。我仍然收到“错误读取数据”消息。 – dazedandconfusedeestudent

+0

@dazedandconfusedeestudent:这个答案解决了你的问题吗? – chqrlie

0

如果你还有问题读取文件-supposing你给的的fopen(...)正确的文件路径,请尝试以下完成代码

#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); 
    } 

这将工作。