2012-10-24 90 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