每行读取一行,并使用 fgets() 和 sscanf() 将字符串评估为坐标
Reading line per line, and evaluating strings into coordinates using fgets() and sscanf()
我正在尝试使用 fgets 和 sscanf 读取多行不同长度的顶点。
(1,6),(2,6),(2,9),(1,9)
(1,5)
我的程序进入第一个顶点的无限循环。
char temp3[255];
while(fgets(temp3, 255, fp)!= NULL){
printf("Polygon %d: ", polycount);
while(sscanf(temp3, "(%d,%d)", &polygonx[polycount][vertcount], &polygony[polycount][vertcount]) != EOF){
sscanf(temp3, ",");
printf("(%d,%d),",polygonx[polycount][vertcount], polygony[polycount][vertcount]);
vertcount++;
}
vertcounts[polycount] = vertcount;
vertcount = 0;
polycount++;
}
我必须能够将顶点的 x 和 y 值输入到多边形数组中,所以我坚持使用 sscanf。我也遇到了问题,因为我在互联网上找不到每行扫描不同数量元素的任何东西。
因为这个
while(sscanf(temp3, "(%d,%d)",
&polygonx[polycount][vertcount], &polygony[polycount][vertcount]) != EOF)
{
}
永远不会是 true
我想,因为 scanf()
return 是成功扫描的参数数量,我会这样做
while(sscanf(temp3, "(%d,%d)",
&polygonx[polycount][vertcount], &polygony[polycount][vertcount]) == 2)
{
}
你的代码无法运行,因为它不满足sscanf()
到returnEOF
的条件,以下来自最后引用的手册页
The value EOF
is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. EOF
is also returned if a read error occurs, in which case the error indicator for the stream (see ferror(3)
) is set, and errno is set to indicate the error.
所以如果在第一次转换成功之前输入或者匹配失败,那么看起来你没有到达终点,根据文件的内容,这是有道理的。当然,第二部分仅适用于文件流。
而不是 sscanf(temp3, ",")
不按照你的想法去做,你可以这样做
next = strchr(temp3, ',');
if (next != NULL)
temp3 = next + 1;
else
/* you've reached the end here */
这是关于如何解析此文件的建议
#include <stdio.h>
#include <string.h>
int
main(void)
{
const char temp3[] = "(1,6),(2,6),(2,9),(1,9)\n(1,5)";
char *source;
int x, y;
int count;
source = temp3;
while (sscanf(source, "(%d,%d)%*[^(]%n", &x, &y, &count) == 2)
{
/* this is just for code clarity */
polygonx[polycount][vertcount] = x;
polygony[polycount][vertcount] = y;
/* Process here if needed, and then advance the pointer */
source += count;
}
return 0;
}
"%n"
说明符捕获到目前为止扫描的字符数,因此您可以使用它来将指针前进到源字符串中扫描的 las 位置。
并且 "%*[^("
将跳过所有字符,直到找到下一个 '('
。
有关 "%n"
说明符和 %[
说明符的更多信息,请参阅 sscanf(3)
。
如果成功读取 sscanf
将 return 2
在这种情况下。 sscanf
returns 填充的变量数。
检查它是否 returns 2
这将在此处指示成功。
while(sscanf(temp3,"(%d,%d)",&polygonx[polycount][vertcount],&polygony[polycount]][vertcount]) != EOF)
而不是这个,像这样检查 -
while(sscanf(temp3,"(%d,%d)%*c",&polygonx[polycount][vertcount],&polygony[polycount]][vertcount])== 2)
^ to exclude the comma after it
也忽略坐标后的','
,你使用-
sscanf(temp3, ",");
不正确。在上面的 sscanf
中,您可以使用 %*c
说明符读取并丢弃它。
我正在尝试使用 fgets 和 sscanf 读取多行不同长度的顶点。
(1,6),(2,6),(2,9),(1,9)
(1,5)
我的程序进入第一个顶点的无限循环。
char temp3[255];
while(fgets(temp3, 255, fp)!= NULL){
printf("Polygon %d: ", polycount);
while(sscanf(temp3, "(%d,%d)", &polygonx[polycount][vertcount], &polygony[polycount][vertcount]) != EOF){
sscanf(temp3, ",");
printf("(%d,%d),",polygonx[polycount][vertcount], polygony[polycount][vertcount]);
vertcount++;
}
vertcounts[polycount] = vertcount;
vertcount = 0;
polycount++;
}
我必须能够将顶点的 x 和 y 值输入到多边形数组中,所以我坚持使用 sscanf。我也遇到了问题,因为我在互联网上找不到每行扫描不同数量元素的任何东西。
因为这个
while(sscanf(temp3, "(%d,%d)",
&polygonx[polycount][vertcount], &polygony[polycount][vertcount]) != EOF)
{
}
永远不会是 true
我想,因为 scanf()
return 是成功扫描的参数数量,我会这样做
while(sscanf(temp3, "(%d,%d)",
&polygonx[polycount][vertcount], &polygony[polycount][vertcount]) == 2)
{
}
你的代码无法运行,因为它不满足sscanf()
到returnEOF
的条件,以下来自最后引用的手册页
The value
EOF
is returned if the end of input is reached before either the first successful conversion or a matching failure occurs.EOF
is also returned if a read error occurs, in which case the error indicator for the stream (seeferror(3)
) is set, and errno is set to indicate the error.
所以如果在第一次转换成功之前输入或者匹配失败,那么看起来你没有到达终点,根据文件的内容,这是有道理的。当然,第二部分仅适用于文件流。
而不是 sscanf(temp3, ",")
不按照你的想法去做,你可以这样做
next = strchr(temp3, ',');
if (next != NULL)
temp3 = next + 1;
else
/* you've reached the end here */
这是关于如何解析此文件的建议
#include <stdio.h>
#include <string.h>
int
main(void)
{
const char temp3[] = "(1,6),(2,6),(2,9),(1,9)\n(1,5)";
char *source;
int x, y;
int count;
source = temp3;
while (sscanf(source, "(%d,%d)%*[^(]%n", &x, &y, &count) == 2)
{
/* this is just for code clarity */
polygonx[polycount][vertcount] = x;
polygony[polycount][vertcount] = y;
/* Process here if needed, and then advance the pointer */
source += count;
}
return 0;
}
"%n"
说明符捕获到目前为止扫描的字符数,因此您可以使用它来将指针前进到源字符串中扫描的 las 位置。
并且 "%*[^("
将跳过所有字符,直到找到下一个 '('
。
有关 "%n"
说明符和 %[
说明符的更多信息,请参阅 sscanf(3)
。
如果成功读取 sscanf
将 return 2
在这种情况下。 sscanf
returns 填充的变量数。
检查它是否 returns 2
这将在此处指示成功。
while(sscanf(temp3,"(%d,%d)",&polygonx[polycount][vertcount],&polygony[polycount]][vertcount]) != EOF)
而不是这个,像这样检查 -
while(sscanf(temp3,"(%d,%d)%*c",&polygonx[polycount][vertcount],&polygony[polycount]][vertcount])== 2)
^ to exclude the comma after it
也忽略坐标后的','
,你使用-
sscanf(temp3, ",");
不正确。在上面的 sscanf
中,您可以使用 %*c
说明符读取并丢弃它。