Lendo coisas por coisas em C++

1. Lendo coisas por coisas em C++

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/02/2018 - 12:04h

Olá pessoas, eu tenho 2 protótipos de pegadores de argumentos em python e um para ler letra por letra,
O De ler argumentos e esse:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys

class main():
def __init__(self):

self.debug = 1
self.packages = []

main = 1

while ( main < 100 ):
try:
self.target = sys.argv[main]
except:
break

if ( self.target == "--debug" or self.target == "-d" ):
self.debug = 2
else:
self.packages.append(self.target)

main = main + 1

main()


Como eu posso fazer isso em "c++"?
Eu estou fazendo um gerenciador de pacotes, e preciso fazer isso.



  


2. Re: Lendo coisas por coisas em C++

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/02/2018 - 18:19h

up?

/dev/disk0s1 is mounted.



3. Re: Lendo coisas por coisas em C++

Fernando
phoemur

(usa Debian)

Enviado em 19/02/2018 - 20:01h

Em C e C++ nos sistemas Unix-like geralmente se usa o getopt como parser de argumentos da linha de comando.
https://www.gnu.org/software/libc/manual/html_node/Getopt-Long-Option-Example.html

Porém existe a possibilidade de usar Boost
https://coderwall.com/p/y3xnxg/using-getopt-vs-boost-in-c-to-handle-arguments

Agora isso é para programas mais complexos com muitas opções. Porém se você for fazer um gerenciador de pacotes talvez seja interessante já usá-los desde o início, pois quando o programa crescer e você sentir a necessidade de usar um parser será mais complicado adaptar do que se já usar desde o início.

Isto posto, se você quiser simplesmente pegar os argumentos da linha de comando é só ler o argumento char* argv[] da função main:


#include <iostream>

int main(int argc, char* argv[])
{
for (int i = 1; i<argc; ++i ) {
std::cout << argv[i] << std::endl;
}

return 0;
}



4. Re: Lendo coisas por coisas em C++

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/02/2018 - 21:13h

Tá, entendi o codigo, supondo que eu use esse codigo no qual você me mandou, como eu passo os argumentos para um array, tipo:

self.package.append(self.target) 


no python? Tem alguma ideia?


/dev/disk0s1 is mounted.



5. Re: Lendo coisas por coisas em C++

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/02/2018 - 23:16h

Os argumentos já estão num array: argv trabalha como um array de ponteiros para caracteres, cada um deles contendo uma string correspondente a um argumento, dispostos na mesma ordem em que foram digitados (incluindo o nome usado para invocar o programa). E a quantidade de elementos do array (ou seja: a quantidade de argumentos) é dado pelo valor inteiro argc.

Suponha que você tem o seguinte programa.

#include <iostream>

int main(int argc, char **argv){
std::cout << "Quantidade de argumentos: argc=" << argc << '\n';
for(int n=0; n<argc; n++)
std::cout << "argv[" << n << "]=\"" << argv[n] << "\"\n";
// O array tem, na verdade, um elemento a mais do que o valor de argc:
// um ponteiro nulo, que é uma outra forma de identificar que se chegou
// ao final dos argumentos armazenados em argv. Esse ponteiro nulo
// será indicado na saída do programa como um valor zero (note que não
// está entre aspas).
std::cout << "argv[" << argc << "]=" << static_cast<void *>(argv[argc]) << "\n";
}


Se você compilar esse programa chamando-o de teste1, e executá-lo com a linha mostrada abaixo, a saída será a que é mostrada logo em seguida.

./teste1 um 2 "tres, meu amigo" 4 

Quantidade de argumentos: argc=5
argv[0]="./teste1"
argv[1]="um"
argv[2]="2"
argv[3]="tres, meu amigo"
argv[4]="4"
argv[5]=0


Por outro lado, se você executar o programa sem passar nenhum argumento extra, argv ainda conterá pelo menos o nome do programa, e isso se refletirá também em argc.

./teste1 

Quantidade de argumentos: argc=1
argv[0]="./teste1"
argv[1]=0


-----------
Nota 1: Algumas pessoas preferem escrever “int main(int argc, char *argv[])”, por achar que os colchetes deixam mais evidente que argv contém um array, e não é um ponteiro genérico qualquer. Do ponto de vista do C ou do C++, as duas notações são absolutamente sinônimas, e caracterizam um ponteiro para ponteiros para caracteres. Contudo, a notação com colchetes, oriunda da linguagem B, que antecedeu o C, e que era a única forma dessa linguagem designar seus ponteiros, se tornou obsoleta no C em praticamente todos os outros usos que eram válidos em B. Por essa obsolescência, a maioria das pessoas que conheço prefere usar apenas os asteriscos.

Nota 2: Se você de todo modo não quiser usar a notação de argumentos de main(), você pode copiar os argumentos para um array (ou outro container qualquer da biblioteca do C++, ou do Boost, ou do Qt, ou qualquer outro).
#include <string>
#include <vector>

int main(int argc, char **argv){
std::vector<std::string> args(argv, argv+argc);
/* ... */
}


EDIT: Nota 3: Você pode ainda criar um vetor que encapsule referências para os argumentos, tendo cópias apenas de ponteiros, mas não dos dados apontados, que serão exatamente os mesmos referenciados por argv.
int main(int argc, char **argv){
// Crio um vetor constante, e faço com que os ponteiros tratem os textos dos
// argumentos como constantes; assim, não corro o risco de alterar sem querer
// a lista de argumentos.
const std::vector<const char *> args(argv, argv+argc);
/* ... */
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts