c - 在 C 中的 I/O 期间打印的交替行

标签 c file io fgets scanf

<分区>

我正在尝试使用 C 更改文本文件的文本格式。 以下是我尝试过的代码。输出的问题是代码会跳过文本文件的每一行。

以下是我要格式化的文件。

Protein
26709
    1MET      N    1  1.826  3.097  3.556 -0.457  0.365 -0.163
    1MET      H    2  1.769  3.168  3.512 -0.606 -0.305 -1.071
    1MET     H2    3  1.781  3.006  3.565  0.271  0.041  0.264
    1MET     H3    4  1.857  3.125  3.649  1.251 -2.295  0.144
    1MET     CA    5  1.948  3.077  3.475 -0.538 -0.282 -0.098
    1MET     HA    6  1.987  2.977  3.504 -2.137 -0.912 -0.071
    1MET     CB    7  1.914  3.075  3.321  0.389 -0.161 -0.089
    1MET    HB2    8  1.848  2.987  3.306 -0.909  0.569  1.297
    1MET    HB3    9  1.869  3.176  3.311 -1.707 -1.073 -0.224
    1MET     CG   10  2.034  3.050  3.220  0.171  0.344 -0.271

我得到的输出是:

Protein

26709

   1MET       H     2   1.769   3.168   3.512  -0.606  -0.305  -1.071
   1MET      H3     4   1.857   3.125   3.649   1.251  -2.295   0.144
   1MET      HA     6   1.987   2.977   3.504  -2.137  -0.912  -0.071
   1MET     HB2     8   1.848   2.987   3.306  -0.909   0.569   1.297
   1MET      CG    10   2.034   3.050   3.220   0.171   0.344  -0.271
   1MET     HG3    12   2.017   2.974   3.140   2.388   1.184  -1.570
   1MET      CE    14   2.245   3.113   3.036   0.088  -0.370   0.744
   1MET     HE2    16   2.311   3.190   2.990  -0.737  -0.490  -0.665
   1MET       C    18   2.043   3.195   3.504  -0.052  -0.237  -0.714

以下是我试过的代码:

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    char buff[200],res[10],atm[10],atmNum[10],x[10],y[10],z[10],vx[10],vy[10],vz[10];
    if (argc<2){
        printf("SYTEM ABORT ! \n Provide the input GRO file");
        exit(1);
    }
    else
        fp=fopen(argv[1],"r");
    while(fgets(buff,200,fp)!=NULL){
        if (strlen(buff) > 10) {
            fscanf(fp,"%s %s %s %s %s %s %s %s %s",res,atm,atmNum,x,y,z,vx,vy,vz);
            if (strcmp(atm,"Na")){
                printf("%7s %7s %5s %7s %7s %7s %7s %7s %7s",res,atm,atmNum,x,y,z,vx,vy,vz);
            }
            else
                printf("%8s %7s %5s %7s %7s %7s %7s %7s %7s",res,atm,atmNum,x,y,z,vx,vy,vz);
        }
        else
            printf("%s",buff);

    }
    fclose(fp);
    return 0;
}

从输出文件可以看出,第一行被跳过,我猜这是由于在 while 循环中使用了 fgets。但在那之后它打印每一行。

最佳答案

但是你在这里使用了 fgets() 然后是 fscanf():

while(fgets(buff,200,fp)!=NULL)  
  if (strlen(buff) > 10) {
    fscanf(fp,"%s %s %s %s %s %s %s %s %s",res,atm,atmNum,x,y,z,vx,vy,vz);

因此,您将使用 fgets() 读取一行,然后使用 fscanf 读取下一行,结果如您所说,将跳过该行。


正如 WhozCraig 所说,您应该使用 sscanf() , 而不是 fscanf() .

关于c - 在 C 中的 I/O 期间打印的交替行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407756/

相关文章:

c - FILE结构中 `_flag`的意义是什么?

android - 输入流 I/O 上的 EBADF(错误文件编号)

objective-c - 如何获得 NSTask 进程的子进程?

c - 使用指针的程序运行不正常

c - 为什么“while(!feof(file))”总是错误的?

java - 使用什么从用户输入在 arrayList 中添加一系列整数

java - 在 Java 中,新建文件的默认位置是什么?

c - 在C中,我们如何使用指针代替数组来更改大小写并打印长度?

c++ - 如何使用 system() 在 c 中执行 2 个连续的系统命令,例如连接到 ftp 并使用程序登录?

c - 从文件读取到数组 - C