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

标签 c file file-io scanf

我正在尝试通过 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/

相关文章:

c - 为什么编译器不警告我明显的错误?

java - 在 Android 上以编程方式编辑 build.prop 的属性

c - 两个结构的 TCP 校验和

c - C 中 ")"标记之前的错误预期表达式

python - 将字节附加到字符串?

Python,如何正确地将一个函数(特别是文件)的结果传递给另一个函数?

Java,使用新创建的文本文件

c - 如何使用 fwrite() 写入一个 int

c - 在 C 中动态索引数组

python - 如果 "a.pyc"文件存在则删除 "a.py"文件