【问题标题】:readinf file in C untill int appears在C中读取文件直到它出现
【发布时间】:2021-02-27 03:44:09
【问题描述】:

我想读入一个格式如下的文件

char double int double int double int
char double int double int double int
int
double

问题是前两行的外观未知,可能只有 2 行这样或更多。 (文件的其余部分是不变的,所以没有问题)

我使用 fscanf() 并且我知道它返回已成功读取的项目数。我想使用它,但结果失败了,因为我猜整数可以毫无问题地读取为字符。

我的代码

int i = 0;
while(fscanf(file, "%c ", &race[i].tireType) != 0)
{
    fscanf(file, "%lf %d %lf %d %lf\n",
           &race[i].newLap,
           &race[i].wearoffLaps,
           &race[i].wearoffRate,
           &race[i].teardownLaps,
           &race[i].teardownRate);
    printf("%c: %lf %d %lf %d %lf\n", race[i].tireType, race[i].newLap, race[i].wearoffLaps, race[i].wearoffRate, race[i].teardownLaps, race[i].teardownRate);
    ++i;
}

当当前行的第一个字母是数字时,如何使循环停止?

【问题讨论】:

  • 使用fgets() 读取每一行并将sscanf() 应用于它,尝试转换两个%s 字符串(每个字符串都停在一个空格处)。当你不能转换 2 个字符串时(sscanf() 的返回值只有1),你已经到达了包含int 的行,你可以重新处理它,因为它仍然存在于一个字符串中。

标签: c file scanf


【解决方案1】:

首先scanf()和朋友不返回读取字节数,而是返回参数列表成功读取&转换的项数。

然后,在扫描"%c" 之前,您可以先尝试扫描"%lf"。根据第一次添加的 fscanf() 返回的内容,您可以决定您在文件中的位置。

由于上述内容有点老套,或者,如果您的文件变得更复杂,您可以考虑使用 Lex 和 Yacc 来明确定义文件的格式/语法。

但由于 Lex 和 Yacc 可能有点矫枉过正,您也可以编写一个简单的状态机,而不是上面建议的硬编码 if-else 逻辑的更骇人听闻的方式。

一般来说,退后一步想想为什么您的文件采用这种格式通常会有所帮助。然后,根据对您的领域的理解,考虑尽可能接近匹配它的实现(即,该文件来自的真实世界)。不要只写有效的代码,而是让它尽可能有意义:意义很重要:-)

【讨论】:

    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多