[英]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()
返回成功掃描的參數數量,我會這樣做
while(sscanf(temp3, "(%d,%d)",
&polygonx[polycount][vertcount], &polygony[polycount][vertcount]) == 2)
{
}
您的代碼不起作用,因為它不滿足sscanf()
返回EOF
,以下摘自最后引用的手冊頁
如果在第一次成功轉換或匹配失敗發生之前到達輸入結束,則返回
EOF
值。 如果發生讀取錯誤,也會返回EOF
,在這種情況下,將設置流的錯誤指示符(請參閱ferror(3)
),並設置errno來指示錯誤。
因此,如果在第一個成功轉換之前發生輸入,或者匹配失敗,您似乎沒有到達終點,這根據文件的內容是有道理的。 第二部分當然僅適用於文件流。
並且可以代替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
將返回2
。 sscanf
返回填充的變量數。
檢查它是否返回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
說明符讀取並丟棄它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.