在 C 中读取文件直到它出现

readinf file in C untill int appears

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

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

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

我使用 fscanf() 并且我知道它 returns 已经成功读取了多少项目。我想使用它,但结果失败了,因为我猜 int 可以毫无问题地读取为 char。

我的代码

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;
}

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

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

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

由于上面的内容有点老套,或者,如果您的文件变得更复杂,您可以考虑使用 Lex & Yacc 明确定义文件的 format/grammar。

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

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