【发布时间】:2014-12-19 03:04:49
【问题描述】:
输入文件是这样的,它在第一行有一个字符串,后跟一个整数,从第二行开始,它有一个字符串,后跟 2 个整数。我下面的代码运行良好,但有没有办法跳过字符串?我只是用一些字符数组 char sink[30] 扫描它。实际上我不需要这个值我怎么能使用 fscanf() 来跳过这个字符串并只读取整数。
#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\n");
for(i=0;i<v;i++)
printf("%d %d\n",p[i],q[i]);
return 0;
}
【问题讨论】:
-
如果您的数据按预期格式化,
fscanf(fp,"%*s %d",&v);工作得很好。如果您的输入格式不正确,它确实不会揭示问题。"%s"和"%d"导致scanf()系列跳过前导空格,因此现在代码失去了区分' '和'\n'的能力。要读取“... on first line”,建议先读取该行,可能使用@unwind 建议的fgets(),然后扫描生成的缓冲区。 -
@chux 我对 fgets() 的理解是它需要一些预定义的缓冲区吗?使用它不是一个问题吗?同样在执行 fgets() 之后我们需要执行 sscanf() 对吗?
-
fgets()需要一个预定义的缓冲区。缓冲区不需要过长,因为重复调用可以处理过长的初始“字符串”。或使用fgetc()。 IAC,不是一个大问题。sscanf()是一种扫描缓冲区的方法,strtol()、strtok()或简单的代码可以解析缓冲区。它归结为输入错误检测要求。使用此代码建议至少进行简单测试:在使用扫描值之前检查来自fscanf()的返回值。确保v像 (0 feof(fp) 的用法是错误的。检查fscanf()的返回值,如果i==v则退出循环。 -
您可以对所有读数使用相同的 fscanf() 调用。然后,在调用检查以确保 facanf() 的返回值为 2 之后,则不会读取第二个字符串参数,如果为 3,则读取两个字符串参数。然后,采取相应的行动。
标签: c