我的結構定義是,讀取從文本文件在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」製表分隔文本文件。
這個文件的每一行包含taxID
,geneID
,goID
,evidence
,qualifier
,goterm
,pubmed
和category
信息。
該文件的每一行都將保存在一個結構中。
當程序運行時,它會首先將輸入文件的內容讀入一個gene2go類型的數組中,我使用了一個叫readInfo
的函數。
該程序也將採取以下輸入參數的命令行,(對於taxid
爲geneid
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 */
我應該怎麼辦?
[的fscanf(http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html)和[與fgets](HTTP: //pubs.opengroup.org/onlinepubs/007904875/functions/fgets.html)似乎是用來解決這個問題的合理功能,並且兩者的使用都有很好的文檔記錄。看來你已經有了一個關於如何開始解決這個問題的想法。你還想找什麼? – WhozCraig
您需要說明如何將字符串轉換爲'pubmed'和'category'字段的'int'。 –
不管你的問題('learn ... fscanf'),爲什麼你決定使用C來完成這個任務?至少20年來這不是最好的所有語言。 – Yury