【问题标题】:Trouble with fscanf syntax when reading files from file从文件中读取文件时出现 fscanf 语法问题
【发布时间】:2020-04-21 23:10:48
【问题描述】:

我正在尝试从 C 语言的文件中读取数据。我正在观看我的教授建议我们观看的有关使用 fscanf 将文件读入内存的示例视频。

但是我在试图弄清楚如何读取一个又一个字符串并在其间使用分隔符时遇到了问题。在示例视频中,他读取了行尾的字符串,并在遇到“\n”字符时停止。

我的 fscanf 应该返回 1 而不是 6(我认为)。我认为我阅读前两个字符串的语法有问题。

以下是我的数据表中的几行:

ggqavxbtdtks|foo|004042|4|3|
ebsawskolwre|foo|001977|4|2|
wthbjpvgkgvy|moo|021392|4|1|
ivftrtsdqwoj|woo|122665|4|1|

这是将数据读入内存的函数。

// Read file and import data into struct
int readData(struct Transaction record[], const char filepath[], const int max)
{
    // Declare Variables
    int amount = 0;
    char ch;

    // Declare filepointer
    FILE* fp = fopen(filepath, "r");

    if (fp != NULL)
    {
        while (amount < max && fscanf(fp, "%30[^|]%*c|%30[^|]%*c|%d|%d|%d|%c", record->title, record->ctg->category, &record->amount, &record->month, &record->day, &ch) == 6)
        {
            if (ch != '\n')
            {
                while (fgetc(fp) != '\n');
            }

            amount++;
        }

        fclose(fp);
        fp = NULL;
    }
    else
    {
        printf("Cannot read file\n");
    }

    // Return number of participants
    return amount;
}

这也是个人项目,不适合学校。我只是想学习新事物。

【问题讨论】:

  • %*c 格式的用途是什么?
  • @Shawn 我不确定,它在视频中使用并且有效,我也在以前的项目中使用过它,具有相同的结构并且没有错误。
  • @Shawn 如果我删除 '*' 我得到一个调试断言失败,缓冲区!= nullptr
  • @user3121023 删除你提到的仍然会导致调试断言失败,缓冲区!= nullptr。
  • @user3629249 我发现问题的原因是我在 ctg 上有一个指针

标签: c file


【解决方案1】:

让我们看看 scanf 模式和输入,看看会发生什么。你的格式字符串是"%30[^|]%*c|%30[^|]%*c|%d|%d|%d|%c",你的输入(第一行)是ggqavxbtdtks|foo|004042|4|3|

第一个模式是%30[^|],它读取字符直到到达| 或读取29 个字符。所以它读取ggqavxbtdtks(将其存储在记录->标题中),留下|foo|004042|4|3|

下一个模式是%*c,它读取并丢弃一个字符,留下foo|004042|4|3|

下一个模式是|,它读取并丢弃|,它失败了(下一个输入字符是f),所以scanf 停止并返回1(一个存储输出成功的模式)。剩下的要读取的输入是(仍然)foo|004042|4|3|

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多