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