2012-10-24 58 views
4

我的结构定义是,读取从文本文件在C输入到结构的阵列

typedef struct { 
    int taxid; 
    int geneid; 
    char goid[20]; 
    char evidence[4]; 
    char qualifier[20]; 
    char goterm[50]; 
    char pubmed; 
    char category[20];  
} gene2go; 

我有称为`“gene2go.txt”制表分隔文本文件。

这个文件的每一行包含taxIDgeneIDgoIDevidencequalifiergotermpubmedcategory信息。

该文件的每一行都将保存在一个结构中。

当程序运行时,它会首先将输入文件的内容读入一个gene2go类型的数组中,我使用了一个叫readInfo的函数。

该程序也将采取以下输入参数的命令行,(对于taxidgeneid 1,2,3为goid

输入类型和搜索术语

有一个名为listData函数将文件“gene2go.txt”中与输入类型和搜索项匹配的行列表写入文件“output.txt”。

这里是我的文本文件"gene2go.txt"的一部分,

3702 814629 GO:0003676 IEA - nucleic acid binding - Function 
3702 814629 GO:0005575 ND - cellular_component - Component 
3702 814629 GO:0005634 ISM - nucleus - Component 
3702 814629 GO:0008150 ND - biological_process - Process 
3702 814629 GO:0008270 IEA - zinc ion binding - Function 
3702 814630 GO:0005634 ISM - nucleus - Component 
3702 814636 GO:0008150 ND - biological_process - Process 
3702 814637 GO:0003674 ND - molecular_function - Function 
6239 177883 GO:0008150 ND - biological_process - Process 
6239 177884 GO:0005575 ND - cellular_component - Component 
6239 177884 GO:0008150 ND - biological_process - Process 
6239 177886 GO:0004364 IDA - glutathione transferase activity 12757851 Function 
6239 177886 GO:0005575 ND - cellular_component - Component 
7955 555450 GO:0005634 IEA - nucleus - Component 
7955 555450 GO:0006355 IEA - regulation of transcription, DNA-dependent - Process 

我已经使用命令行

gcc ceng301.c -o ceng301

下面写一个名为ceng301.c的代码和编译它,但是当我写

ceng301 1 3702

在命令行中,我什么也得不到,但闪烁的下划线代替:(

3702 814629 GO:0003676 IEA - nucleic acid binding - Function 
3702 814629 GO:0005575 ND - cellular_component - Component 
3702 814629 GO:0005634 ISM - nucleus - Component 
3702 814629 GO:0008150 ND - biological_process - Process 
3702 814629 GO:0008270 IEA - zinc ion binding - Function 
3702 814630 GO:0005634 ISM - nucleus - Component 
3702 814636 GO:0008150 ND - biological_process - Process 
3702 814637 GO:0003674 ND - molecular_function - Function 

保存在output.txt

下面是代码,

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

/* structure definition */ 
typedef struct { 
    int taxid; 
    int geneid; 
    char goid[20]; 
    char evidence[4]; 
    char qualifier[20]; 
    char goterm[50]; 
    char *pubmed; 
    char category[20]; 
} gene2go; 

/* function prototypes */ 
int readInfo(gene2go input[]); 
void listData(char *inType, char *searchItem, gene2go input[], int i); 

int main(int argc, char *argv[]) 
{ 
    gene2go input[200]; 
    int i; 

    i = readInfo(input); 
    listData(argv[1], argv[2], input, i); 

    return 0; 
} 

/* read the input file*/ 
int readInfo(gene2go input[]) { 
    FILE *fin; 
    char *inputName = "gene2go.txt"; 
    int i = 0; 

    fin = fopen(inputName, "r"); 

    if(fin == NULL) { 
     printf("File cannot be opened\n"); 
    } /* end if */ 
    else { 
     while(!feof(fin)) { 
     fscanf(fin, "%[^\t]", &input[i].taxid, 
           &input[i].geneid, 
           &input[i].goid, 
           &input[i].evidence, 
           &input[i].qualifier, 
           &input[i].goterm, 
           &input[i].pubmed, 
           &input[i].category); 
     i++; 
    } /* end while */ 

    fclose(fin); 
    } /* end else */ 

    return i; 
} /* end function readInfo */ 

void listData(char *inType, char* searchItem, gene2go input[], int i) { 
    FILE *fout; 
    char *outputName = "output.txt"; 
    int j; 
    int inputType = atoi(inType); 

    fout = fopen(outputName, "w"); 

    switch(inputType) { 
     case 1: 
      for(j = 0; j < i; j++) { 
       if(input[j].taxid == atoi(searchItem)) { 
        fprintf(fout, "%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\n", input[i].taxid, 
                     input[i].geneid, 
                     input[i].goid, 
                     input[i].evidence, 
                     input[i].qualifier, 
                     input[i].goterm, 
                     input[i].pubmed, 
                     input[i].category); 
       } /* end if */ 
      } /* end for */ 
      break; 
    case 2: 
      for(j = 0; j < i; j++) { 
       if(input[j].geneid == atoi(searchItem)) { 
        fprintf(fout, "%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\n", input[i].taxid, 
                    input[i].geneid, 
                    input[i].goid, 
                    input[i].evidence, 
                    input[i].qualifier, 
                    input[i].goterm, 
                    input[i].pubmed, 
                    input[i].category); 
       } /* end if */ 
      } /* end for */ 
      break; 
    case 3: 
      for(j = 0; j < i; j++) { 
       if(input[j].goid == searchItem) { 
        fprintf(fout, "%d\t%d\t%s\t%s\t%s\t%s\t%s\t%s\n", input[i].taxid, 
                    input[i].geneid, 
                    input[i].goid, 
                    input[i].evidence, 
                    input[i].qualifier, 
                    input[i].goterm, 
                    input[i].pubmed, 
                    input[i].category); 
       } /* end if */ 
      } /* end for */ 
      break; 
} /* end switch */ 

fclose(fout); 
} /* end function listData */ 

我应该怎么办?

+0

[的fscanf(http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html)和[与fgets](HTTP: //pubs.opengroup.org/onlinepubs/007904875/functions/fgets.html)似乎是用来解决这个问题的合理功能,并且两者的使用都有很好的文档记录。看来你已经有了一个关于如何开始解决这个问题的想法。你还想找什么? – WhozCraig

+0

您需要说明如何将字符串转换为'pubmed'和'category'字段的'int'。 –

+2

不管你的问题('learn ... fscanf'),为什么你决定使用C来完成这个任务?至少20年来这不是最好的所有语言。 – Yury

回答

0
char mystring[100]; 
FILE *p = fopen ("gene2go.txt" , "r"); 
if (p == NULL) perror ("Error opening file"); 
    else { 
    if (fgets (mystring , 100 , pFile) != NULL) 
     puts (mystring); 
     pch = strtok (mystring, "\t"); 
     while (pch != NULL) 
     { 
      //handle each token here and insert into struct 
      pch = strtok (NULL, "\t"); 
     } 
    fclose (pFile); 
    } 
    return 0; 

参见strtokfgets

+0

感谢您的帮助。我会根据你的建议引用strtok和fgets,并希望我会为这个问题写出完整的代码。 – fatih