如何使用while循环打印fscanf的每一行,直到文件结束?

How to use a while loop to print each line of a fscanf until the end of the file?

提问人:PapaPumpkin 提问时间:10/19/2023 最后编辑:PapaPumpkin 更新时间:10/20/2023 访问量:54

问:

这段代码背后的想法是读取输入文件,每行包含两位数字,然后将其打印到另一个文件(进行一些小的更改等)。 我能够使用 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;
}
C 文件 while 循环

评论

2赞 John Doe 10/19/2023
它在哪些方面不起作用?它没有完成?你遇到错误吗?你得到错误的结果?
2赞 Serge Ballesta 10/19/2023
嗯。。。让 2 个连续读取相同的值是很奇怪的,当你说你的输入文件每行有 2 个数字时。但是没有示例输入,也没有实际和预期的输出,我不能说更多......fscanfcustomer1
0赞 PapaPumpkin 10/20/2023
我已经编辑了帖子以包含这些东西,有什么想法吗?
0赞 PapaPumpkin 10/20/2023
输入应该每行有两个值 idk 为什么它在我编辑我的 bad 时删除了我的间距。
0赞 PapaPumpkin 10/20/2023
nvm 想通了 pog

答:

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。 谢谢!

评论

0赞 Community 10/23/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。