读取和打印文件

时间:2014-10-07 10:43:52

标签: c file fgets

我正在上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 个答案:

答案 0 :(得分:0)

您的文件按行排列,因此最好按行阅读。它的函数是fgets,它将一个特定最大长度的整行读入char缓冲区。它保留终止换行符(除非因为最大长度而截断行,但是现在不要处理它)。如果到达文件末尾,fgets将返回行缓冲区或NULL

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

<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 */
}