我能够让程序打开文件,但是我无法阅读这些信息。它需要逐行运行数据,但它仍然被我的“错误读取数据”循环捕获。我该如何解决这个问题?
#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
答案 0 :(得分:1)
以下是您的代码中的一些问题:
变量应在main
函数中本地化。
测试!data
和data == 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);
}
这将有效。