[英]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
函數中設為局部變量。
測試!data
和data == 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.