提问人:PapaPumpkin 提问时间:10/19/2023 最后编辑:PapaPumpkin 更新时间:10/20/2023 访问量:54
如何使用while循环打印fscanf的每一行,直到文件结束?
How to use a while loop to print each line of a fscanf until the end of the file?
问:
这段代码背后的想法是读取输入文件,每行包含两位数字,然后将其打印到另一个文件(进行一些小的更改等)。 我能够使用 for 循环使代码完美运行,但前提是我知道文件中有多少行。 我现在使用的 while 循环不起作用,关于如何重复 fprintf 直到文件末尾的任何修复或想法?
示例输入 = 1 2.3 2 5.9 3 2.7 示例输出 = 客户 1 已花费 2.3*2.99(对所有客户重复)
我只需要一种方法,让我的循环重复我的 fscanf 并打印语句一直到文件末尾。
由于分段错误,我现在拥有的循环不起作用。
#include <stdio.h>
int main(){
int customer1;
double cost1;
int x;
double totalCost = 0;
FILE * saleInput;
FILE * saleOutput;
saleInput = fopen("sales.txt","r");
saleOutput = fopen("recordsales.txt","w");
printf("Retrieving the Records from today's sale!\n");
while(fscanf(saleInput,"%d",&customer1)!=EOF)
{
fscanf(saleInput,"%d%lf",&customer1,&cost1);
cost1 = cost1*2.99;
printf("Customer: %d\t", customer1); //yes a tab character was used
printf("Spent: $%.2lf\n", cost1);
fprintf(saleOutput, "Customer: %d\t", customer1);
fprintf(saleOutput, "Spent: $%.2lf\n", cost1);
totalCost += cost1;
}
fprintf(saleOutput, "-----------------------------\n");
printf("-----------------------------\n");
printf("$%.2lf was made today.\n", totalCost);
fprintf(saleOutput,"$%.2lf was made today.\n", totalCost);
return 0;
}
答:
3赞
Jabberwocky
10/19/2023
#1
有 4 个问题:
- 你不初始化,它的初始值是不确定的,你需要把它初始化为0。
cost1
- 您正在读取该值两次。
customer1
- 你不会检查你的呼叫是否成功。
fopen
- 您应该明确检查您是否正在读取 2 个值,但无论如何,都不应该在实际程序中使用,因为无法处理无效输入。
fscanf
我假设 sales.txt 文件的格式是这样的:
10 15.55
10 23.50
20 100.00
你想要这个:
...
saleInput = fopen("sales.txt", "r");
if (saleInput == NULL) // << add this
{
printf("Cannot open sales.txt\n");
return;
}
saleOutput = fopen("recordsales.txt", "w");
if (saleOutput == NULL) // << add this
{
printf("Cannot open recordsales.txt\n");
return;
}
printf("Retrieving the Records from today's sale!\n");
cost1 = 0; // << add this
while (fscanf(saleInput, "%d %lf", &customer1, &cost1) == 2) // while we read exactly 2 values
{
cost1 = cost1 * 2.99;
...
评论
0赞
PapaPumpkin
10/20/2023
不幸的是,这个问题被分配给我,并附有明确的说明,因此添加额外的 printf 语句是不:(。你在我的代码中看到的 while 循环完全是从我的教授那里复制的,他让它工作,我似乎找不到我的地方。但一个区别是他没有两次调用 fscanf,所以这肯定与此有关。无论如何,谢谢:P
-1赞
PapaPumpkin
10/20/2023
#2
我不得不更改 while(fscanf(saleInput,“%d”,&customer1)!=EOF) to while(fscanf(saleInput, “%d %lf”, &customer1, &cost1) != EOF) 并摆脱循环中多余的 fscanf。 谢谢!
评论
fscanf
customer1