读取一个文件,解析并编写另一个文件

时间:2010-11-12 13:22:32

标签: c file-io

考虑一下文件,

L,12/5/2008,Blacktown
C,Willy Wonker,10.00
C,Adolph Hitler,20.00
C,Attila the Hun,30.00
C,Idi Amin,40.00
C,Ghengis Khan,50.00
T,150.00
L,13/5/2008,Parramatta
C,Attila the Hun,100.10
C,Willy Wonker,200.20
C,Ghengis Khan,300.30
T,600.60
L,14/5/2008,Mount Druitt
C,Adolph Hitler,1000.00
T,2000.00
L,15/5/2008,Penrith
T,0.00
L,16/5/2008,Chatswood
C,Ghengis Khan,1.00
C,Idi Amin,10.00
C,Adolph Hitler,100.00
C,Attila the Hun,1000.00
T,1111.00

我需要编写一个打开文件Collections.txt的程序,读取它并按给定顺序对其进行格式化,然后将其写入另一个名为Reports.txt的文件中。我需要datetab,然后是name。然后是新行namestabamount。重复直到检测到T;这表明我们没有更多的上述位置的集合。然后冲洗并重复每个位置,直到它到达文件末尾,并且必须显示最终总数。

这是我写的代码,

/*
This program collects data and writes it to a specific file.*/

#include <stdio.h>
#include <stdlib.h>

void debt_calculator();
void main()
{

    printf("This is a debt collection program:\n ");
    debt_calculator();
    scanf("%*c");
}

void debt_calculator()
{
    char code;
    int date [40];
    char location [40];
    char name [40];
    float amount = 0;
    float total = 0;
    float grand_total;
    int ctr = 0;

    FILE * Collections;
    Collections=fopen("C:\\Users\\Nick\\Documents\\Visual Studio 2010\\Projects\\Assignment2\\Assignment2\\Collections.txt","r");
    if(Collections==NULL)
    {
        printf("file not open:\n");
        exit(1);
    }

    FILE * Report;
    if((Report=fopen("C:\\Users\\Nick\\Documents\\Visual Studio 2010\\Projects\\Assignment2\\Assignment2\\Report.txt","w"))==NULL)
    {
        printf("can not open file: \n");
        exit(1);
    }


    fscanf(Collections,"%c,",&code);

    while(code == 'L')
    {
        fscanf(Collections,"%[^,],%s%*c",date,location);
        fprintf(Report,"Date: %s \t Location: %s \n\n",date, location);
        fscanf(Collections,"%c,",&code); 
    }

    for(code == 'C'; ctr < 5; ctr++)
    {
        fscanf(Collections,"%[^,], %f %*c",name, & amount);
        if(amount == 0)
        {
            fprintf(Report,"### No Collections for %s \n", location);
            fprintf(Report,"total: \t 0.00\n");
        }

        fprintf(Report,"\n Name: %s \t Amount: %.2f \n",name, amount);
        fscanf(Collections,"%c,",&code);
    }

    code == 'T';
    while(code == 'T')
    {
        fprintf(Report,"Hello");
        fscanf(Collections,"%f",& amount);
        total += amount;
        grand_total += total;
        fprintf(Report,"Total: \t %.2f \n",& total);
        fprintf(Report,"Grand Total of all Collections is: $ %.2f", grand_total);
        fscanf(Collections,"%c" , & code);
    }

    fclose(Collections);
    fclose(Report);
}

当我运行上面的程序时,它会显示printf()语句,当我按下回车键并退出时。比我打开我的report.txt文件,找到日期标签位置新行以及T之前的所有名称和费用。一旦它到达'T'它停止,我不能让它进入最后一个while循环,读取总数并将其打印到文件而不是通过再次检查代码重复。 T之后的代码是L所以它应该返回到第一个while循环并读取而不是写入日期和位置,但它不会。我有什么想法吗?

如果您认为我应该这样做有更好的方式,请告诉我。

1 个答案:

答案 0 :(得分:2)

您是否尝试踩入调试器并在执行此操作时观察变量状态?

这一行:

fprintf(Report,"Total: \t %.2f \n",& total);

肯定是不正确的,%f不指望指针。

如果期望code == 'T';会强制它进入循环,那你就错了,code = 'T';会起作用。

同样在这个循环中:

for(code == 'C'; ctr < 5; ctr++)

初始化表达式shpuld为code = 'C'

尝试将编译器警告级别设置为\ W4和\ Wx(所有警告都是错误),然后编译器可以帮助您发现此类错误。