【问题标题】:Reading and printing to/from a file从文件读取和打印
【发布时间】:2014-10-07 10:43:52
【问题描述】:

我正在学习 C 课程并且面临以下任务: 1. 加载 XCode 并开始一个新的 C 项目。如果您愿意,请删除 项目中的任何无关代码,以便您离开 只需要在你的 项目。 2.提示用户输入两个值——第一个是一个字符 “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;
}

【问题讨论】:

  • fgets(action, 1, pFile);错了,编译器给你警告了吗?
  • 检查 man strtolman fgets。不要不要尝试使用fscanf(),因为面对格式错误的输入/读取失败,该函数很难正确使用。
  • 并且请使用fgets的返回值终止读取,不要依赖feof。 (到达文件末尾时fgets 返回NULL。)
  • ..和man fgetc
  • IOW,不要这样做:while(!(feof(pFile))), Read here for why

标签: c file fgets


【解决方案1】:

您的文件是按行组织的,因此最好逐行阅读。其功能是fgets,它将某一最大长度的整行读入一个字符缓冲区。它保留终止的换行符(除非该行由于最大长度而被截断,但我们现在不处理)。 fgets 返回行缓冲区,如果到达文件末尾,则返回 NULL

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

<action>, <amount>

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

您的函数的骨架可能如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多