我正在尝试通过 C 代码读取以下 gro 文件。
FJP in Pol Water in water t= 0.00000 step= 0
16
1FJP P 1 5.346 7.418 0.319
2FJP P 2 5.151 7.405 0.499
3FJP P 3 5.260 7.178 0.428
4FJP P 4 5.159 6.961 0.342
5FJP P 5 5.355 6.909 0.220
6FJP P 6 5.169 6.824 0.043
7FJP P 7 5.068 6.669 11.454
8FJP P 8 4.919 6.861 11.482
9FJP P 9 4.835 7.075 11.364
10FJP P 10 4.738 6.987 11.197
11FJP P 11 4.847 7.115 10.993
12FJP P 12 4.642 7.126 10.870
13FJP P 13 4.680 6.940 10.674
14FJP P 14 4.521 7.052 10.545
15FJP P 15 4.321 6.973 10.513
16FJP P 16 4.315 6.728 10.516
11.56681 11.56681 11.56681
我的代码是:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[])
{
char input_file[]="file.gro";
FILE *input;
char *myfile=malloc(sizeof(char)*80);
sprintf(myfile,"%s",input_file); //the .gro file being read in
input=fopen(myfile,"r");
double dummy1,dummy6,dummy7,dummy8,dummy9,dummy10,dummy11;
int dummy2,dummy3,dummy4,dummy5;
int lines=0;
while (fscanf(input,"FJP in Pol Water in water t= %lf step= %d",&dummy1,&dummy2)==2
||fscanf(input," %d\n",&dummy3)==1
||fscanf(input," %dFJP P %d %lf %lf %lf\n",
&dummy4,&dummy5,&dummy6,&dummy7,&dummy8)==5
||fscanf(input," %lf %lf %lf\n",&dummy9,&dummy10,&dummy11)==3)
{
printf("%lf %d\n",dummy1,dummy2);
printf("%d\n",dummy3);
printf("%d %d\n",dummy4,dummy5);
printf("%lf %lf %lf\n",dummy6,dummy7,dummy8);
printf("%lf %lf %lf\n",dummy9,dummy10,dummy11);
lines=lines+1;
}
printf("lines=%d\n",lines);
fclose(input);
}
问题是各种虚拟变量打印的值与文件中的值不匹配。此外,正在读取的行数为 3,而不是 19,这与文件匹配。我不确定读取此文件的 fscanf() 语句有什么不正确。任何对此问题的帮助将不胜感激。
最佳答案
您的主要问题是您假设 scanf 比实际情况更好。
Scanf 将读取并解析尽可能多的参数,然后放弃。它不会倒回到 scanf 的开头。它还将空格和换行符(和制表符)视为简单的“跳过所有空格”
因此 printf("%d\n",dummy3)
行将尝试解析主线,例如 1FJP
它将把数字 1 OK 读入 dummy3,但随后会卡住,因为 P != 空格。
所有其他规则都会陷入困境,因为它们都不会首先期望 P 或任何字符串。
如果您想这样做,您只需在预期时更智能地应用 scanf 语句即可。
关于c - 如何使用 C 语言中的 fscanf() 读取 .gro 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59198734/