2015-12-02 75 views
0

我在这个程序中遇到了一些严重的麻烦。 我需要从一个文件中读取数据,这个文件有一组名和姓,一个cookie类型,购买金额,成本以及是否支付。从文件读取变量并将它们存储在结构中 - C

我相当有信心,我的功能是正确的。

当我运行该程序时,它运行正常,但在某些数字之间看起来会有额外的数字。我的意思是,如果输入的文件是: 约翰绿薄荷1 1.00是 简蓝筹2 2.00ñ 输出文件将是这样的: 约翰·格林12 20000薄荷455 1等等

有任何想法吗?我猜我读了文件/将它们存储到结构中。

#include <stdio.h> 
#include <ctype.h> 

/*structure definition*/ 
struct customer{ 
    char first[12], last[12], type[10], paid; 
    int boxes; 
    float cost; 
}; 

/*prototypes*/ 
void readCustomerData(FILE*, struct customer[]); 
void printCustomerData(FILE*, int, struct customer[]); 
float moneyReceived(int, struct customer[]); 
int custWhoOwe(int, struct customer[]); 
float moneyOutstanding(int, struct customer[]); 
int moneyReceivedPercent(int, struct customer[]); 

int main(){ 
    int numCustomers; 
    float money, money2; 
    int cust, perc; 
    FILE*input; 
    FILE*output; 

    input = fopen("custInfo.txt", "r"); 
    output = fopen("output.txt", "w"); 

    fscanf(input, "%d", &numCustomers); 


    struct customer customerData[numCustomers]; 

    readCustomerData(input, customerData); 
    printCustomerData(output, numCustomers, customerData); 
    fprintf(output, "Summary:\n\n"); 
    money = moneyReceived(numCustomers, customerData); 
    fprintf(output, "Total Cash Received: $%.2f\n\n", money); 
    cust = custWhoOwe(numCustomers, customerData); 
    fprintf(output, "Num customers who have not paid: %d\n\n", cust); 
    money2 = moneyOutstanding(numCustomers, customerData); 
    fprintf(output, "Total Amount Outstanding: $%.2f\n\n", money2); 
    perc = moneyReceivedPercent(numCustomers, customerData); 
    fprintf(output, "Percentage of Sales outstanding: %d%%\n\n", perc); 



    fclose(input); 
    fclose(output); 
    return 0; 
} 

void readCustomerData(FILE*file, struct customer cdata[]){ 
    int numCustomers, i; 
    file = fopen("custInfo.txt", "r"); 

    fscanf(file, "%d", &numCustomers); 

    for (i=0; i<numCustomers; i++){ 
     fscanf(file, "%s%s%s%d%f%c", &cdata[i].first, &cdata[i].last, &cdata[i].type, &cdata[i].boxes, &cdata[i].cost, &cdata[i].paid); 
    } 
    fclose(file); 
} 

void printCustomerData(FILE*file, int num, struct customer cdata[]){ 
    int i; 
    fprintf(file, "Customers:\n\n"); 
    fprintf(file, "Name\t\tType of Cookie\t\tNum of Boxes\tCost of Box\tPaid\n"); 
    fprintf(file, "--------------------------------------------------------------------------------\n\n"); 
    for (i=0; i<num; i++){ 
    fprintf(file, "%s %s\t", cdata[i].first, cdata[i].last); 
    fprintf(file, "%s\t\t", cdata[i].type); 
    fprintf(file, "%d\t\t", cdata[i].boxes); 
    fprintf(file, "$%.2f\t\t", cdata[i].cost); 
    fprintf(file, "%c", cdata[i].paid); 
    fprintf(file, "\n\n"); 
} 
    fprintf(file, "\n\n\n\n\n"); 

} 

float moneyReceived(int num, struct customer cdata[]){ 
    int i, sum=0; 
    for (i=0; i<num; i++){ 
     if(cdata[i].paid=='Y'){ 
      sum= sum+(cdata[i].cost*cdata[i].boxes);} 
} 
    return sum; 
} 

int custWhoOwe(int num, struct customer cdata[]){ 
    int count=0, i; 
    for (i=0; i<num; i++){ 
     if (cdata[i].paid=='N'){ 
      count++;} 
    } 
    return count; 
} 

float moneyOutstanding(int num, struct customer cdata[]){ 
    int i, sum=0; 
    for (i=0; i<num; i++){ 
     if (cdata[i].paid=='N'){ 
      sum= sum+(cdata[i].cost*cdata[i].boxes);} 
    } 
    return sum; 
} 

int moneyReceivedPercent(int num, struct customer cdata[]){ 
    int answ; 
    float money, moneyOut; 
    money = moneyReceived(num, cdata); 
    moneyOut = moneyOutstanding(num, cdata); 

    answ=(moneyOut/money)*100; 

    return answ; 
} 
+0

'fscanf(file,“%s%s%s%d%f%c”,' - >'fscanf(file,“%s%s%s%d%f%c”, '在%c之前添加空格 – chux

+0

上帝的甜妈你真是太好了谢谢你!! – AwesomeSauce

+0

这是为什么呢?btw – AwesomeSauce

回答

1

输入的空白​​字符(由isspace为函数指定)被跳过,除非本说明书包括一个[c,或n说明符。 C11§7.21.6.28

1)在"%c"之前增加一个空格消耗空白。 "%c"本身并不这样做。其他使用说明符即使没有领先空间也是如此。

2)检查*scanf()函数的返回值。除非返回值为6,在这种情况下,不要相信扫描已成功完成。

3)通过声明一个小于'%s'的大小的宽度来限制字符串输入。应该防止代码溢出阵列。

for (i=0; i<numCustomers; i++){ 
    // fscanf(file, "%s%s%s%d%f%c", &cdata[i].first, &cdata[i].last, 
    // &cdata[i].type, &cdata[i].boxes, &cdata[i].cost, &cdata[i].paid); 

    if (6 != fscanf(file, "%11s%11s%9s%d%f %c", 
     &cdata[i].first, &cdata[i].last, &cdata[i].type, 
     &cdata[i].boxes, &cdata[i].cost, &cdata[i].paid)) { 
    printf("Bad input!"); 
    } 
} 
相关问题