有没有办法阻止 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 空格之外,数字字段在数字和分号之间可以有空格在数字之前)。如果文件不符合,则处理停止。
我正在尝试逐行读取文件,并在每行中从中获取总共 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 空格之外,数字字段在数字和分号之间可以有空格在数字之前)。如果文件不符合,则处理停止。