繁体   English   中英

有没有办法阻止 fscanf 的初始字符串将整行保留在 C 中?

[英]Is there a way to stop the initial string of an fscanf from keeping the whole line in C?

我正在尝试逐行读取文件,并在每行上从其中获取总共 6 个变量,从一个字符串开始,后跟 5 个整数问题是每次我尝试这个初始字符串只保留整行并且整数是留下随机数。 那么有没有办法在第一个“;”上停止该初始字符串。 文件中的变量写为:string;V1;V2;V3;V4;V5

FILE *fp;
fp = fopen("MP.txt","r");
char tipo[20];
int V1,V2,V3,V4,V5;
while(!feof(fp)){
    fscanf(fp, "%s;%d;%d;%d;%d;%d", tipo,&V1,&V2,&V3,&V4,&V5);
    printf("\n%s\v1:%d\V2:%d\V3:%d\V4:%d\V5:%d\n",tipo,V1,V2,V3,V4,V5);
}

我还尝试在我在评论中看到的字符串之后添加%[^;]但它不起作用。

此外,文件上的初始字符串在每一行上都有不同的大小。

%s格式说明符使fscanf尽可能多地读取字符串。 你可以做两件事来阻止它:

  • 指定要读取的最大字符数!
  • 指定一个字符范围( [ .. ]而不是s

在字符串输入上,您应该始终给出要读取的最大字符数,即缓冲区大小减一:

char s[100];
scanf("%99s",...);

您可以使用字符范围仅指定那些有效作为输入的字符,或者根据需要指定分隔符:

char s[100];
scanf("%99[^;]",...);  // read all characters up to but not including a ';'

另外,不要在 EOF 上循环。 输入循环应采用以下形式:

while (1)
{
  attempt_to_read_stuff();
  if (attempt_failed()) break;
  do_stuff();
}

您通常可以将尝试读取和失败位作为循环条件的一部分。 在你的情况下,这将是:

FILE *fp = fopen("MP.txt","r");
if (!fp) complain_and_quit();  // Don’t forget to check file opened OK

char tipo[20];
int V[5];
while (fscanf(fp,"%19[^;];%d ;%d ;%d ;%d ;%d\n",tipo,V+0,V+1,V+2,V+3,V+4) == 6)
{
  printf("%s:%d:%d:%d:%d:%d\n",tipo,V[0],V[1],V[2],V[3],V[4]);
}

fclose(fp);

这接受一种非常严格的文件格式(您的帖子指出的格式,除了数字之前已经可能存在的空格外,数字字段在数字和分号之间可以有空格)。 如果文件不符合,则处理停止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM