Elusione metacarratteri shell linux! [c++]

di il
9 risposte

Elusione metacarratteri shell linux! [c++]

Ciao ragazzi!
ho un problema : ho scritto un progetto (per l'università ) in c++ il quale prende in input dalla shell un file.txt sul quale andrà a lavorare!
Il mio problema è che il prof vuole che l'input venga passato dalla shell esclusivamente nel seguente modo:
nomeeseguibile < nomefile.txt

Io ho pensato di usare argv[] per catturare il nome del file che il prof mette in input( il nome lo deve decidere lui) solo che il il primo parametro che viene passato al programma ( per capirci argv[1]="<") nella shell è un comando e quindi in argv[2] non mi viene passato il nome del file come vorrei in quanto trovando il metacarattere '<' quello che c'è dopo non viene preso dall'argv[]
come posso fare per eludere l'effetto del metacarattere in questione?
Specifico anche che vorrei che in argv[2] ci fosse la stringa contenente il nome del file che poi io passero in input alla funzione open della libreria fstream per aprire il file

grazie dell'aiuto

9 Risposte

  • Re: Elusione metacarratteri shell linux! [c++]

    Sei fuori strada ... con

    <file.txt

    il contenuto del file viene rediretto allo standard input, quindi ti basta questo
    
    	char buffer[100];
    
    	while(fgets(buffer, 99, stdin) != NULL)
    		printf("%s", buffer);
    
    per leggere il contenuto stesso.
  • Re: Elusione metacarratteri shell linux! [c++]

    Intanto grazie mille per la risposta!
    il problema che come dici tu in buffer viene salvato il contenuto del file! A noi serve solo il nome da passare alla funzione open della libreria fstream
    faccio un esempio:
    ammettendo che il nostro listato si chiami prova.cpp e il file che gli passiamo si chiami file.txt, e che all'interno di file sia salvata la stringa "ciao mondo". come dici tu in buffer viene salvato "ciao mondo" noi, invece abbiamo bisogno di riuscire a prendere solo il nome del file ovvere in questo caso "file.txt"

    grazie se ci puoi aiutare
  • Re: Elusione metacarratteri shell linux! [c++]

    Scusa ma a cosa ti serve il nome del file ?
  • Re: Elusione metacarratteri shell linux! [c++]

    Secondo me, se prendi il nome del file per "riaprire" il file tramite fstream invece di prendere direttamente il contenuto da stdin, il prof vi boccia...e farebbe bene
  • Re: Elusione metacarratteri shell linux! [c++]

    mentat ha scritto:


    Secondo me, se prendi il nome del file per "riaprire" il file tramite fstream invece di prendere direttamente il contenuto da stdin, il prof vi boccia...e farebbe bene
    Se vi serve a riaprirlo per leggerlo, sì, farebbe bene a bocciarvi ...
  • Re: Elusione metacarratteri shell linux! [c++]

    In ogni caso non si può fare. Il "metacarattere" "<" non è affatto un metacarattere ma è un vero e proprio comando impartito al sistema operativo che viene eseguito prima dell'eseguibile.

    Il seguente comando nomeeseguibile < nomefile.txt dà origine alla seguente serie di operazioni:

    1. prendi il contenuto del file nomefile.txt
    2. usalo come input dell'eseguibile nomeeseguibile

    Quindi pensare che "<" e "nomefile.txt" facciano parte dell'array argv[] è proprio sbagliato.

    Speriamo che il vostro professore non legga questo forum...
  • Re: Elusione metacarratteri shell linux! [c++]

    mentat ha scritto:


    In ogni caso non si può fare. Il "metacarattere" "<" non è affatto un metacarattere ma è un vero e proprio comando impartito al sistema operativo che viene eseguito prima dell'eseguibile:...
    E' vero che è un comando ma < è un metacarattere! non è sbagliato definirlo cosi!
  • Re: Elusione metacarratteri shell linux! [c++]

    Non è affatto un metacarattere (anche se in molti programmi universitari viene riportato in questo modo) ... in realtà un metacarattere rappresenta un "insieme di altri caratteri" (ad esempio * e ? per i caratteri jolly) mentre < e > "eseguono un'operazione" (meglio operatori di redirezione) ... ma non è importante questo ...
  • Re: Elusione metacarratteri shell linux! [c++]

    Possiamo definirlo come vogliamo, ma la semantica non cambia, quel simbolo "<" rappresenta un'operazione impartita al sistema operativo che viene eseguita prima del programma. Dato che la parola "metacarattere" rimanda al concetto di "carattere" e quindi al concetto di "argomento passato al programma" ho pensato che fosse particolarmente fuorviante... ed infatti, almeno nel tuo caso, lo è stato tant'è che intendevi gestirla come argomento al pari di altri caratteri. Per fortuna il sistema operativo rende impossibile (o almeno difficile) perseguire tale strada ed ecco che la verità si manifesta in tutta la sua semplicità: non devi leggere il "nome" del file, devi leggere "il file".
Devi accedere o registrarti per scrivere nel forum
9 risposte