[英]reading input from text file into array of structures in c
My structure definition is, 我的结构定义是,
typedef struct {
int taxid;
int geneid;
char goid[20];
char evidence[4];
char qualifier[20];
char goterm[50];
char pubmed;
char category[20];
} gene2go;
I have tab-seperated text file called `"gene2go.txt". 我有一个名为“gene2go.txt”的标签分隔文本文件。
Each line of this file contains taxID
, geneID
, goID
, evidence
, qualifier
, goterm
, pubmed
and category
information. 该文件的每一行都包含
taxID
, geneID
, goID
, evidence
, qualifier
, goterm
, pubmed
和category
信息。
Each line of the file will be kept in a structure. 文件的每一行都将保存在一个结构中。
When the program is run, it will first read the content of the input file into an array of type gene2go, I used a function called readInfo
. 当程序运行时,它会首先将输入文件的内容读入gen2go类型的数组中,我使用了一个名为
readInfo
的函数。
The program will also take the following input arguments from the command line, 该程序还将从命令行获取以下输入参数,
input type ( 1 for taxid
, 2 for geneid
, 3 for goid
) and search term 输入类型(1表示
taxid
,2表示geneid
,3表示goid
)和搜索词
There is a function called listData
to write the list of lines in the file “gene2go.txt” that match the input type and search term, to the file “output.txt”. 有一个名为
listData
的函数将文件“gene2go.txt”中与输入类型和搜索项匹配的行列表写入文件“output.txt”。
Here is a part of my text file "gene2go.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
I have written the code below named ceng301.c and compiled it using the command line 我编写了下面名为ceng301.c的代码,并使用命令行编译它
gcc ceng301.c -o ceng301
, but when I write ,但是当我写作
ceng301 1 3702
in the command line, I get nothing, but a blinking underscore :( instead of 在命令行中,我什么都没得到,但闪烁的下划线:(而不是
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
saved in output.txt
保存在
output.txt
Here is the code, 这是代码,
#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 */
What should I do? 我该怎么办?
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.