odczyt danych wejściowych z pliku tekstowego do tablicy struktur w c

Moja definicja struktury to,

typedef struct {
    int taxid;
    int geneid;
    char goid[20];
    char evidence[4];
    char qualifier[20];
    char goterm[50];
    char pubmed;
    char category[20];    
} gene2go;

Mam rozdzielony tabulatorami plik tekstowy o nazwie `" gene2go.txt ".

Każda linia tego pliku zawierataxID, geneID, goID, evidence, qualifier, goterm, pubmed icategory Informacja.

Każda linia pliku będzie przechowywana w strukturze.

Gdy program zostanie uruchomiony, najpierw odczyta zawartość pliku wejściowego do tablicy typu gen2go, użyłem funkcji o nazwiereadInfo.

Program weźmie również następujące argumenty wejściowe z linii poleceń,

typ wejścia (1 dlataxid, 2 zageneid, 3 zagoid ) i wyszukiwane hasło

Istnieje funkcja o nazwielistData aby zapisać listę linii w pliku „gene2go.txt”, które pasują do typu wejścia i wyszukiwanego hasła, do pliku „output.txt”.

Oto część mojego pliku tekstowego"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

Napisałem poniższy kod o nazwie ceng301.c i skompilowałem go przy użyciu wiersza poleceń

gcc ceng301.c -o ceng301

, ale kiedy piszę

ceng301 1 3702

w linii poleceń nic nie otrzymuję, ale miga podkreślenie :( zamiast

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

zapisane woutput.txt

Oto kod,

#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 */

Co powinienem zrobić?

questionAnswers(1)

yourAnswerToTheQuestion