C ++ .exe с файлом в качестве аргумента - PullRequest
1 голос
/ 17 июня 2020

Прошу прощения за плохое название, однако я не знаю, как это объяснить.

Недавно я нашел код, который я пытаюсь проанализировать и понять, чтобы реализовать какую-то его часть в другом проекте.

Однако я не могу понять, как управляется обрабатываемый файл.

Исполняемый файл запускается с помощью такой команды:

./leandvb --f32 -f 800000 --sr 50000 --derotate 50000 --cnr -d <DVBS_50Ksym_800Ksps_50KHz_IF.iq> output4.ts  

код внутри int main (int arg c, const char * argv []), однако, выглядит следующим образом:

int main(int argc, const char *argv[]) {
  config cfg;

  for (int i = 0; i<argc;i++)
  {
    std::cout<<"INDEX: "<<i<<" ARG: "<<argv[i]<<" \n";
    std::cout<<"INDEX: "<<i<<" ARGS: "<<argc<<" \n";
  }

  for ( int i=1; i<argc; ++i ) {   
    if      ( ! strcmp(argv[i], "-h") )
      usage(argv[0], stdout, 0);
    else if ( ! strcmp(argv[i], "-v") )
      cfg.verbose = true;
    else if ( ! strcmp(argv[i], "-d") ) {
      cfg.debug2 = cfg.debug;
      cfg.debug = true;
    }
    else if ( ! strcmp(argv[i], "--version") ) {
      printf("%s\n", VERSION);
      return 0;
    }
    else if ( ! strcmp(argv[i], "-f") && i+1<argc )
      cfg.Fs = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--sr") && i+1<argc )
      cfg.Fm = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--standard") && i+1<argc ) {
      ++i;
      if      ( ! strcmp(argv[i], "DVB-S" ) )
    cfg.standard = config::DVB_S;
      else if ( ! strcmp(argv[i], "DVB-S2" ) )
    cfg.standard = config::DVB_S2;
      else usage(argv[0], stderr, 1, argv[i]);
    }
    else if ( ! strcmp(argv[i], "--const") && i+1<argc ) {
      ++i;
      int c;
      for ( c=0; c<cstln_base::COUNT; ++c )
    if ( ! strcmp(argv[i], cstln_base::names[c]) ) {
      cfg.constellation = (cstln_base::predef)c;
      break;
    }
      if ( c == cstln_base::COUNT )
    usage(argv[0], stderr, 1, argv[i]);
    }
    else if ( ! strcmp(argv[i], "--strongpls") )
      cfg.strongpls = true;
    else if ( ! strcmp(argv[i], "--modcods") && i+1<argc )
      cfg.modcods = strtol(argv[++i], NULL, 0);
    else if ( ! strcmp(argv[i], "--framesizes") && i+1<argc )
      cfg.framesizes = strtol(argv[++i], NULL, 0);
    else if ( ! strcmp(argv[i], "--cr") && i+1<argc ) {
      ++i;
      int f;
      for ( f=0; f<FEC_COUNT; ++f )
    if ( ! strcmp(argv[i], fec_names[f]) ) {
      cfg.fec = (code_rate)f;
      break;
    }
      if ( f == FEC_COUNT )
    usage(argv[0], stderr, 1, argv[i]);
    }
    else if ( ! strcmp(argv[i], "--fastlock") )
      cfg.fastlock = true;
    else if ( ! strcmp(argv[i], "--fastdrift") )
      cfg.fastdrift = true;
    else if ( ! strcmp(argv[i], "--viterbi") )
      cfg.viterbi = true;
    else if ( ! strcmp(argv[i], "--ldpc-bf") && i+1<argc )
      cfg.ldpc_bf = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--ldpc-helper") && i+1<argc )
      cfg.ldpc_helper = argv[++i];
    else if ( ! strcmp(argv[i], "--nhelpers") && i+1<argc )
      cfg.nhelpers = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--hard-metric") )
      cfg.hard_metric = true;
    else if ( ! strcmp(argv[i], "--filter") ) {
      fprintf(stderr, "--filter is obsolete; use --resample.\n");
      cfg.resample = true;
    }
    else if ( ! strcmp(argv[i], "--resample") )
      cfg.resample = true;
    else if ( ! strcmp(argv[i], "--resample-rej") && i+1<argc )
      cfg.resample_rej = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--decim") && i+1<argc )
      cfg.decim = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--sampler") && i+1<argc ) {
      ++i;
      if      (!strcmp(argv[i],"nearest")) cfg.sampler = config::SAMP_NEAREST;
      else if (!strcmp(argv[i],"linear" )) cfg.sampler = config::SAMP_LINEAR;
      else if (!strcmp(argv[i],"rrc"    )) cfg.sampler = config::SAMP_RRC;
      else usage(argv[0], stderr, 1, argv[i]);
    }
    else if ( ! strcmp(argv[i], "--rrc-steps") && i+1<argc )
      cfg.rrc_steps = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--rrc-rej") && i+1<argc )
      cfg.rrc_rej = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--roll-off") && i+1<argc )
      cfg.rolloff = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--hq") ) {
      cfg.fastlock = true;
      cfg.viterbi = true;
      cfg.sampler = config::SAMP_RRC;
    }
    else if ( ! strcmp(argv[i], "--hs") )
      cfg.highspeed = true;
    else if ( ! strcmp(argv[i], "--anf") && i+1<argc )
      cfg.anf = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--cnr") )
      cfg.cnr = true;
    else if ( ! strcmp(argv[i], "--tune") && i+1<argc ) {
      fprintf(stderr, "\n** --tune is broken, use --derotate instead.\n\n");
      cfg.Ftune = atof(argv[++i]);
    } else if ( ! strcmp(argv[i], "--drift") )
      cfg.allow_drift = true;
    else if ( ! strcmp(argv[i], "--freq-tol") && i+1<argc )
      cfg.freq_tol = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--sr-tol") && i+1<argc )
      cfg.sr_tol = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--hdlc") )
      cfg.hdlc = true;
    else if ( ! strcmp(argv[i], "--packetized") )
      cfg.packetized = true;
#ifdef GUI
    else if  ( ! strcmp(argv[i], "--gui") )
      cfg.gui = true;
    else if ( ! strcmp(argv[i], "--duration") && i+1<argc )
      cfg.duration = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--linger") )
      cfg.linger = true;
#endif
    else if ( ! strcmp(argv[i], "--u8") )
      cfg.input_format = config::INPUT_U8;
    else if ( ! strcmp(argv[i], "--s8") )
      cfg.input_format = config::INPUT_S8;
    else if ( ! strcmp(argv[i], "--s12") )
      cfg.input_format = config::INPUT_S12;
    else if ( ! strcmp(argv[i], "--s16") )
      cfg.input_format = config::INPUT_S16;
    else if ( ! strcmp(argv[i], "--f32") )
      cfg.input_format = config::INPUT_F32;
    else if ( ! strcmp(argv[i], "--float-scale") && i+1<argc )
      cfg.float_scale = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--loop") )
      cfg.loop_input = true;
    else if ( ! strcmp(argv[i], "--inpipe")  && i+1<argc )
      cfg.input_pipe = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--inbuf")  && i+1<argc )
      cfg.input_buffer = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--buf-factor")  && i+1<argc )
      cfg.buf_factor = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--derotate") && i+1<argc )
      cfg.Fderot = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--fd-pp") && i+1<argc )
      cfg.fd_pp = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--fd-gse") && i+1<argc )
      cfg.fd_gse = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--awgn") && i+1<argc )
      cfg.awgn = atof(argv[++i]);
    else if ( ! strcmp(argv[i], "--fd-info") && i+1<argc )
      cfg.fd_info = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--fd-iqsymbols") && i+1<argc )
      cfg.fd_iqsymbols = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--fd-const") && i+1<argc )
      cfg.fd_const = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--fd-spectrum") && i+1<argc )
      cfg.fd_spectrum = atoi(argv[++i]);
    else if ( ! strcmp(argv[i], "--json") )
      cfg.json = true;
    else
      usage(argv[0], stderr, 1, argv[i]);
  }

  if ( cfg.highspeed ) {
    fail("--hs mode is broken");
#if 0
    switch ( cfg.standard ) {
    case config::DVB_S:  return run_highspeed(cfg);
    case config::DVB_S2: return run_highspeed_s2(cfg);
    }
#endif
  }
  switch ( cfg.standard ) {
  case config::DVB_S:  return run_dvbs(cfg);
  case config::DVB_S2: return run_dvbs2(cfg);
  }
}

Как видите, он управляет всеми возможными флагами, которые вы можете указать в качестве параметров для командная строка, но я не могу понять, как обрабатывается файл DVBS_50Ksym_800Ksps_50KHz_IF.iq, поскольку кажется, что он нигде не управляется, не читается и не обрабатывается. информация при необходимости.

EDIT:

Как было предложено Нейтом, я обнаружил, что, вероятно, файл управляется через стандартный ввод, однако есть много вложенных функций, классов и т. д. такие типы, как:

case config::INPUT_U8: {
      pipebuf<cu8> *p_stdin =
    new pipebuf<cu8>(sch, "stdin", BUF_BASEBAND+cfg.input_buffer);
      file_reader<cu8> *r_stdin =
    new file_reader<cu8>(sch, 0, *p_stdin);
      r_stdin->loop = cfg.loop_input;
      cconverter<u8,128, f32,0, 1,1> *r_convert =
    new cconverter<u8,128, f32,0, 1,1>(sch, *p_stdin, *p_rawiq);
      amp = 128;
      break;
    }

В настоящее время я передаю двоичный (.IQ) файл исполняемому файлу, однако, чтобы реализовать этот код там, где это необходимо, мне нужно будет избегать использования файлов и использовать вместо этого буфер может быть буфером типа char или float или любого другого типа, как я могу заставить stdin получить мой буфер char *, которым я управляю внутри C ++ в качестве элемента, чтобы следующий код вместо этого получил доступ к нему из stdin файла, заданного с перенаправлением оболочки? возможно ли это из кода C ++?

EDIT 2:

исходный репозиторий находится здесь: https://github.com/pabr/leansdr/tree/master/src

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...