Lectura de entrada de archivo de texto en una matriz de estructuras en c
La definición de mi estructura es,
typedef struct {
int taxid;
int geneid;
char goid[20];
char evidence[4];
char qualifier[20];
char goterm[50];
char pubmed;
char category[20];
} gene2go;
Tengo un archivo de texto separado por tabuladores llamado `" gene2go.txt ".
Cada línea de este archivo contienetaxID
, geneID
, goID
, evidence
, qualifier
, goterm
, pubmed
ycategory
información.
Cada línea del archivo se mantendrá en una estructura.
Cuando se ejecuta el programa, primero leerá el contenido del archivo de entrada en una matriz de tipo gene2go, usé una función llamadareadInfo
.
El programa también tomará los siguientes argumentos de entrada desde la línea de comando,
tipo de entrada (1 parataxid
, 2 parageneid
, 3 paragoid
) y término de búsqueda
Hay una función llamadalistData
para escribir la lista de líneas en el archivo "gene2go.txt" que coincida con el tipo de entrada y el término de búsqueda, con el archivo "output.txt".
Aquí está una parte de mi archivo de texto"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
He escrito el siguiente código llamado ceng301.c y lo he compilado utilizando la línea de comandos
gcc ceng301.c -o ceng301
, pero cuando escribo
ceng301 1 3702
en la línea de comandos, no obtengo nada, pero un guión bajo parpadea :( en lugar de
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
guardado enoutput.txt
Aquí está el código,
#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 */
¿Qué tengo que hacer?