C编程:打印包含文本文件中特定单词的所有行时出错

时间:2015-11-19 19:06:10

标签: c text

我想打印输入文件中的所有行" 1PGB.pdb"到文件" out"包含单词" ATOM"。

以下是我的代码。

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

int main()
  {
    char line[1000];
    char *pch;
    char c[5] = "ATOM";
    char buff[5];

    FILE *fp = fopen("1PGB.pdb", "r");
    FILE *op = fopen("out", "w");

    if(fp == NULL || op == NULL)
       {
          fprintf(stderr, "Error opening file.");
          exit(1);
       }
    else 
       {
         while (fgets(c, sizeof(line), fp) != 0)
           {
              if((pch = strstr (c, buff))!= 0)
              fprintf(op, "%s\n", c);
           }
       }

   fclose(fp);
   fclose(op);
 }

错误:它打印来自&#34; 1PGB.pdb&#34;的所有行。提交给&#34; out&#34;文件。

1PGB.pdb文件的几行如下:

REMARK 525    HOH A  79        DISTANCE =  8.99 ANGSTROMS                       
DBREF  1PGB A    2    56  UNP    P06654   SPG1_STRSG     228    282             
SEQRES   1 A   56  MET THR TYR LYS LEU ILE LEU ASN GLY LYS THR LEU LYS          
SEQRES   2 A   56  GLY GLU THR THR THR GLU ALA VAL ASP ALA ALA THR ALA          
SEQRES   3 A   56  GLU LYS VAL PHE LYS GLN TYR ALA ASN ASP ASN GLY VAL          
SEQRES   4 A   56  ASP GLY GLU TRP THR TYR ASP ASP ALA THR LYS THR PHE          
SEQRES   5 A   56  THR VAL THR GLU                                              
FORMUL   2  HOH   *24(H2 O)                                                     
HELIX    1   1 ALA A   23  ASP A   36  1                                  14    
SHEET    1  S1 4 LEU A  12  ALA A  20  0                                        
SHEET    2  S1 4 MET A   1  GLY A   9 -1                                        
SHEET    3  S1 4 LYS A  50  GLU A  56  1                                        
SHEET    4  S1 4 GLU A  42  ASP A  46 -1                                        
CRYST1   36.633   36.633   79.254  90.00  90.00 120.00 P 31 2 1      6          
ORIGX1      1.000000  0.000000  0.000000        0.00000                         
ORIGX2      0.000000  1.000000  0.000000        0.00000                         
ORIGX3      0.000000  0.000000  1.000000        0.00000                         
SCALE1      0.027298  0.015760  0.000000        0.00000                         
SCALE2      0.000000  0.031521  0.000000        0.00000                         
SCALE3      0.000000  0.000000  0.012618        0.00000                         
ATOM      1  N   MET A   1      12.969  18.506  30.954  1.00 15.93           N  
ATOM      2  CA  MET A   1      13.935  18.529  29.843  1.00 17.40           C  
ATOM      3  C   MET A   1      13.138  18.692  28.517  1.00 14.65           C  
ATOM      4  O   MET A   1      12.007  18.222  28.397  1.00 13.04           O  
ATOM      5  CB  MET A   1      14.733  17.216  29.882  1.00 20.72           C

1 个答案:

答案 0 :(得分:2)

char c[4] = "ATOM";应为char c[5] = "ATOM";,每个C字符串末尾都有一个隐式'\0'。 <{1}}或char c[] = "ATOM";也是可能的。

const char *c = "ATOM";应为while (fgets(c, sizeof(line), fp) != 0),您要写入while (fgets(line, sizeof(line), fp) != 0)缓冲区。

line应为if((pch = strstr (c, buff))!= 0)。您正在if ((pch = strstr(line, c))!= 0)中的字符串中查找字符串c(包含&#34; ATOM&#34;)。

如果要将该行写入文件,

line应为fprintf(op, "%s\n", c);。如果你想从&#34; ATOM&#34;开始写下剩下的行,那么fprintf(op, "%s", line);也是可能的。进入文件。 @Tom Zych指出fgets中的字符串中已经有一个新行,所以你不需要在fprintf(op, "%s", pch);中添加另一行。在这种情况下,您也可以使用fprintf