在 while 循环中使用 fscanf() 读取文本文件
Read a text file using fscanf() in a while loop
因此我尝试在 while 循环中使用 fscanf() 从输入文本文件中读取数字对。文本文件类似于以下内容:
(2, 50) (4, 30) (9, 30) (10, 400) (-5, -40)
(7, 20) (19, 200) (20, 50) (-18, -200) (-2, 29)
我的代码是:
int main()
{
FILE *fp;
fp = fopen("File", "r");
if (fp == NULL)
{
perror("Invalid input!");
return 0;
}
else
{
int key, value;
int check;
while (fscanf(fp, "(%d,%d)", &key, &value) != EOF)
{
printf("(%d, %d)\n", key, value);
check = fscanf(fp, "(%d,%d)", &key, &value);
printf("%d", check);
}
}
return 0;
}
但是输出不是遍历文件中的每一对,而是无限地打印 (2,50)。有人可以帮我修复我的代码吗?
我也希望至少 'check' returns 2 因为它成功地获得了两个值 2 和 50。但它总是 return 0.
之后您必须阅读 space,这可以通过以下方式完成:
fscanf(fp, "(%d,%d)%*c", &key, &value)
。这里 %*c
正在读取一个字符并将其丢弃。
或通过
fscanf(fp, "(%d,%d) ", &key, &value)
。在这里你明确地阅读了 space.
注:
我不确定你为什么只在事后打印支票,你实际上是在跳过一对,请注意这一点。
在输入中允许白色-space
"(%d,%d)"
不读取括号之间的 space:) (
。在'('
、')'
、','
之前允许白色-space。 "%d"
已经允许前导白色-space.
// while (fscanf(fp, "(%d,%d)", &key, &value) != EOF)
while (fscanf(fp, " (%d ,%d )", &key, &value) != EOF)
// ^ ^ ^
对比目标,没有一个失败的目标
fscanf(fp, " (%d ,%d )"...
returns 2,1,0,EOF。只有当 return 值为 2 时,循环才会继续。使用 != EOF
,当 return 值为 2,1 或 0 时循环继续。
// while (fscanf(fp, " (%d ,%d )", &key, &value) != EOF)
while (fscanf(fp, " (%d ,%d )", &key, &value) == 2)
因此我尝试在 while 循环中使用 fscanf() 从输入文本文件中读取数字对。文本文件类似于以下内容:
(2, 50) (4, 30) (9, 30) (10, 400) (-5, -40)
(7, 20) (19, 200) (20, 50) (-18, -200) (-2, 29)
我的代码是:
int main()
{
FILE *fp;
fp = fopen("File", "r");
if (fp == NULL)
{
perror("Invalid input!");
return 0;
}
else
{
int key, value;
int check;
while (fscanf(fp, "(%d,%d)", &key, &value) != EOF)
{
printf("(%d, %d)\n", key, value);
check = fscanf(fp, "(%d,%d)", &key, &value);
printf("%d", check);
}
}
return 0;
}
但是输出不是遍历文件中的每一对,而是无限地打印 (2,50)。有人可以帮我修复我的代码吗?
我也希望至少 'check' returns 2 因为它成功地获得了两个值 2 和 50。但它总是 return 0.
之后您必须阅读 space,这可以通过以下方式完成:
fscanf(fp, "(%d,%d)%*c", &key, &value)
。这里 %*c
正在读取一个字符并将其丢弃。
或通过
fscanf(fp, "(%d,%d) ", &key, &value)
。在这里你明确地阅读了 space.
注:
我不确定你为什么只在事后打印支票,你实际上是在跳过一对,请注意这一点。
在输入中允许白色-space
"(%d,%d)"
不读取括号之间的 space:) (
。在'('
、')'
、','
之前允许白色-space。 "%d"
已经允许前导白色-space.
// while (fscanf(fp, "(%d,%d)", &key, &value) != EOF)
while (fscanf(fp, " (%d ,%d )", &key, &value) != EOF)
// ^ ^ ^
对比目标,没有一个失败的目标
fscanf(fp, " (%d ,%d )"...
returns 2,1,0,EOF。只有当 return 值为 2 时,循环才会继续。使用 != EOF
,当 return 值为 2,1 或 0 时循环继续。
// while (fscanf(fp, " (%d ,%d )", &key, &value) != EOF)
while (fscanf(fp, " (%d ,%d )", &key, &value) == 2)