2014-10-07 86 views
-2

我正在学习关于C的课程并且面临以下任务:1.加载XCode并启动一个新的C项目。如果您愿意,请从项目中删除 任何无关代码,以便您只需在 项目中运行主要功能所需的 。 2.提示用户输入两个值 - 第一个char 值'D'或'C'。第二个值应该是代表金额的浮动点数值。 3.由于每个值被输入记录它是 将其保存在以下格式的文本文件: d,250 \ n C,500 \ n 4.测试程序,并检查它创建 文本文件以确保它符合要求的格式。 5.编写第二个程序,假设起始余额为 $ 1,000.00,并输出已完成的分类帐和最终余额 ,并从您之前创建的 文本文件中添加或减去每个条目。应标记为'C' 的条目应添加到帐户中,并且标记为'D' 的条目应被扣除(扣除)。从文件读取和打印

我已经创建了该文件,现在进入步骤5,我相信我知道如何从文件中获取第一个字符来检查它是'c'还是'd',但在此之后,我不确定如何从同一行获取数值。我该怎么做呢?这是到目前为止我的代码(我不确定要放什么的if/else if语句):

FILE *pFile = fopen("Users/Justin/Desktop/Ledger.txt", "r"); 
    float startingBalance = 1000.00; 
    char action; 

    if(pFile != NULL) 
    { 
     while(!(feof(pFile))) 
     { 
      fgets(action, 1, pFile); 

      if(action == 'D' || action == 'd') 
      { 

      } 
      else if(action == 'C' || action == 'c') 
       { 

       } 
      else 
       printf("IO Error: Problem with file"); 

     } 
    } 



    return 0; 
} 
+1

'与fgets(动作,1,pFile);'是错的,编译器是否给你一个警告? – 2014-10-07 10:47:10

+0

检查['man strtol'](http://www.manpagez.com/man/3/strtol/)和['man fgets'](http://www.manpagez.com/man/3/fgets /)。 *不*尝试使用'fscanf()',因为该功能在输入/读取失败时可能无法正确使用。 – DevSolar 2014-10-07 10:48:27

+1

请使用'fgets'的返回值来终止阅读,不要依赖'feof'。 (到达文件末尾时''fgets'返回'NULL') – 2014-10-07 10:50:32

回答

0

你的文件是在组织的,所以这是最好的阅读行明智。这个函数的功能是fgets,它会将一个最大长度的整行读入char缓冲区。它保留了终止换行符(除非该行由于最大长度而被截断,但我们现在不处理)。如果到达文件末尾,则返回行缓冲区fgetsNULL

一旦你有一条线,你必须检查该线。你的线条都具有相同的语法,即

<action>, <amount> 

,所以你可以使用sscanf,这是不是很好,但很快又脏。 (scanf■错误处理,例如,是非常基本的,所以一个好的策略是完全忽略格式错误行。)

你的函数的骨架可能是这样的:

int ledger(const char *fn) 
{ 
    FILE *f; 
    char line[80];    /* char buffer for line */ 
    int lineno = 0;    /* for error reporting */ 

    f = fopen(fn, "r"); 
    if (f == NULL) return -1; /* error */ 

    while (fgets(line, sizeof(line), f)) { 
     char action; 
     double amount; 
     int n; 

     lineno++; 
     n = sscanf(line, " %c, %lf", &action, &amount); 

     if (n < 2) { 
      printf("Skipping badly formatted line %d\n", lineno); 
      continue; 
     } 

     /* Do stuff, e.g. just print */ 
     printf("%c, %16.2f\n", action, amount); 
    } 
    fclose(f); 

    return 0; /* success */ 
}