簡體   English   中英

將.txt文件讀入C程序

[英]Reading .txt file into C program

我可以獲取打開文件的程序,但無法讀取信息。 它需要逐行運行數據,但是它一直被我的“讀取數據錯誤”循環所吸引。 我怎樣才能解決這個問題?

#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

這是您的代碼中的一些問題:

  • 變量應在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);
}

如果仍然無法讀取文件-假設您在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);
     }

那可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM