чтение ввода из текстового файла в массив структур в 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.

Программа также примет следующие входные аргументы из командной строки,

тип ввода (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 <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 */

Что я должен делать?

Ответы на вопрос(1)

Ваш ответ на вопрос