繁体   English   中英

如何使用 C 语言中的 fscanf() 读取 .gro 文件?

[英]How can fscanf(), in C, be used to read a .gro file?

我正在尝试通过 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 语句。

问题是您尝试重复读取和匹配标题,在读取每一行之前(在 while 循环中)。您应该读取一次标题,然后读取行。 您也只需要跳过任何给定的空格一次。 所以你最终得到如下代码:

if (fscanf(input,"FJP in Pol Water in water t=%lf step=%d%d", &dummy1, &dummy2, &dummy3) != 3) {
    fprintf(stderr, "Invalid header\n");
    exit(1); }
while (fscanf(input,"%dFJP P%d%lf%lf%lf", &dummy4, &dummy5, &dummy6, &dummy7, &dummy8) == 5)  {
    ... read a line of the table

暂无
暂无

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

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