考虑一下文件,
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
的文件中。我需要date
,tab
,然后是name
。然后是新行names
,tab
和amount
。重复直到检测到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循环并读取而不是写入日期和位置,但它不会。我有什么想法吗?
如果您认为我应该这样做有更好的方式,请告诉我。
答案 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(所有警告都是错误),然后编译器可以帮助您发现此类错误。