将.txt文件读入C程序

时间:2016-11-04 07:45:22

标签: 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 个答案:

答案 0 :(得分:1)

以下是您的代码中的一些问题:

  • 变量应在main函数中本地化。

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

  • 员工身份是一个字符,应使用%c格式解析为char变量

  • 您应该将值传递给printf而不是地址。

  • 您也应该按值传递数据printdata,不需要传递地址。

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

  • 如果没有加班,您必须将overpay设置为0.0,否则将其设置为未初始化或保留前一名员工的值。

  • 代表钱的打印浮点值应该用2位小数,而不是默认值6.由于类型不精确,最终可能会使用123456.799999而不是{{1} }。

  • 换行符表示为123456.80,而不是\n

  • /n在读取值时忽略空格,但在打印时应将值分开。

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

以下是如何更正代码:

printf

答案 1 :(得分:0)

如果您仍然在阅读文件时遇到问题 - 请在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);
     }

这将有效。