将文本文件中的输入读入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
信息。
文件的每一行都将保存在一个结构中。
当程序运行时,它会首先将输入文件的内容读入gen2go类型的数组中,我使用了一个名为readInfo
的函数。
该程序还将从命令行获取以下输入参数,
输入类型(1表示taxid
,2表示geneid
,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
我编写了下面名为ceng301.c的代码,并使用命令行编译它
gcc ceng301.c -o ceng301
,但是当我写作
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 #include /* 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 */
我该怎么办?
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;
参考strtok , fgets