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

vjrehmav  于 2023-11-17  发布在  其他
关注(0)|答案(2)|浏览(128)

这段代码背后的想法是读取输入文件,每行包含两位数字,然后将其打印到另一个文件中(有一些小的变化等).我能够使代码工作无障碍使用一个for循环,但只有当我知道有多少行在文件中.我现在使用的while循环不工作,有什么修正或想法,我可以重复fprintf直到文件结束?
示例输入= 1 2.3 2 5.9 3 2.7示例输出=客户1已花费2.3*2.99(对所有客户重复)
我只需要一种方法,让我的循环重复我的fscanf和print语句,直到文件的末尾。
我现在的循环由于分段错误而不工作。

#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;
}

字符串

h22fl7wq

h22fl7wq1#

有4个问题:

  • 不初始化cost1,初始值不确定,需要初始化为0。
  • 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;
    ...

bttbmeg0

bttbmeg02#

我不得不将while(fscanf(sale Input,"%d”,&customer1)!= 0)改为while(fscanf(sale Input,“%d %lf”,&customer1,&cost1)!= 0),并去掉循环中多余的fscanf。谢谢!

相关问题