Using fscanf() to skip a string
输入文件的第一行包含一个字符串,后跟一个整数,第二行包含一个字符串,后跟2个整数。 我的以下代码运行良好,但是有没有办法跳过字符串? 我只是用一些字符数组char sink [30]进行扫描。 实际上,我不需要此值,如何使用fscanf()跳过此字符串并仅读取整数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<stdio.h>
#include<stdlib.h>
int main ()
{
int v ,i =0,f =1;
static int *p ,*q ;
FILE *fp ;
char sink [30];
fp = fopen("some.txt","r");
while(!feof(fp ))
{
if(f )
{
fscanf(fp ,"%s %d",sink ,&v );
p = (int *)malloc(sizeof(int)*v );
q = (int *)malloc(sizeof(int)*v );
f =0;
}
else
{
fscanf(fp ,"%s %d %d",sink ,&p [i ],&q [i ]);
i ++;
}
}
fclose(fp );
printf("The input vertices are\
");
for(i =0;i <v ;i ++)
printf("%d %d\
",p [i ],q [i ]);
return 0;
} |
-
如果数据按预期格式设置,则fscanf(fp,"%*s %d",&v);效果很好。如果您的输入格式错误,它不会显示问题。 "%s"和"%d"导致scanf()系列跳过前导空白,因此现在代码已经失去了区分 和\
的能力。要阅读" ...在第一行",建议首先阅读该行,如@unwind建议使用fgets()进行阅读,然后扫描结果缓冲区。
-
@chux我对fgets()的了解是否需要一些预定义的缓冲区,使用它是否会引起关注?在执行fgets()之后也需要再次执行sscanf()吗?
-
fgets()需要预定义的缓冲区。缓冲区不必过长,因为重复调用可以处理过长的初始"字符串"。或使用fgetc()。 IAC,不是一个大问题。 sscanf()是扫描缓冲区的一种方法,strtol(),strtok()或简单的代码可以解析缓冲区。归结为输入错误检测要求。使用此代码将建议至少进行简单的测试:在使用扫描值之前,检查fscanf()中的返回值。确保v像(0 feof(fp)的使用是错误的。而是检查fscanf()的返回值,如果i==v则退出循环。
-
您可以对所有读数使用相同的fscanf()调用。然后,在调用检查之后,确保facanf()的返回值为2,则第二个字符串参数均未读取任何内容,如果为3,则两个字符串参数均已读取。然后,采取相应措施。
要丢弃scanf中的数据,请在格式说明符之间使用星号,例如%*s,%*c等。对于fscanf来说也是相同的。 只需添加一个星号即可扫描并丢弃字符串:
这将扫描文件中的字符串,将其丢弃,然后扫描并将整数分配给v。 您可以为第二个fscanf做同样的事情:
1
| fscanf(fp ,"%*s %d %d",&p [i ],&q [i ]); |
如果您的输入是面向行的,那么最好使用面向行的输入。 如fgets(),它使您可以阅读整行。 当然,跟踪读取行是否为第一行很容易。
也:
-
您应该检查fscanf()(和其他I / O函数)的返回值,因为它们可能会失败。
-
不要在C中强制转换malloc()的返回值。
-
有趣的阅读! 我一直都在强制转换malloc(),所以即使在将内存分配给struct或任何其他数据类型时也不需要强制转换malloc吗? 我以前只是做malloc beofre,但后来我开始进行转换,因为我看到很多人都这样做
-
您无需强制转换即可将void *转换为C中的任何其他(非功能)指针。因此,请不要。