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

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

我正在尝试逐行读取文件,并在每行中从中获取总共 6 个变量,以字符串开头,后跟 5 个整数 问题是每次我尝试这个时,初始字符串只保留整行,而整数则留下随机数。那么有没有办法在第一个“;”上停止那个初始字符串。 文件中的变量写为: 字符串;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();
}

您通常可以使 attempt-to-read-and-fail 位成为循环条件的一部分。在你的情况下是:

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);

这接受一种非常严格的文件格式(由您的 post 指定的格式,除了 already-possible 空格之外,数字字段在数字和分号之间可以有空格在数字之前)。如果文件不符合,则处理停止。