Salve a tutti. Ho un problema riguardo la funzione getopt del linguaggio C. In pratica devo aprire un file dalla linea di comando e mettere il suo contenuto in un array. Non capisco cosa sto sbagliando: il compilatore non dà problemi, ma quando vado a lanciare il programma con il comando

./getopt -i text.txt

mi esce

segmentation fault (core dump created)

Allego il pezzo di codice. Ovviamente il file text.txt è dentro la stessa cartella dell'esecutivo. Come compilatore uso gcc.

Aiutatemi, vi prego!

    //codice 
 #include<unistd.h>

 #include<stdio.h>

 int main(int argc, char** argv){

      int opt, j;
      FILE *fp; 
      char *a;

     while((opt=getopt(argc, argv, "i:q:we:"))!=-1){ 
      switch(opt){ 
         case 'i': 
            fp=fopen("optarg", "r"); 
            printf("scansiono\n"); 
            for(j=0;fscanf(fp, "%s", (a+j))>0; j++){ 
               printf("%s\n", (a+j)); 
            } 
            break; 
         case 'e': 
            //TODO 
            break; 
         default: 
            printf("errore\n"); 
}

chiesto 23 Dic '13, 16:31

vale_glr's gravatar image

vale_glr
20224

modificato 23 Dic '13, 16:58


L'errore sta nel fatto che apri il file di nome "optarg", anziché il file il cui nome è contenuto nella variabile optarg: in sostanza devi modificare questa riga:

fp=fopen("optarg", "r");

nel seguente modo:

fp=fopen(optarg, "r");

C'è anche un altro errore, la variabile a va dichiarata come array e non come puntatore, altrimenti il compilatore non allocherà spazio per i caratteri puntati:

char a[100];

naturalmente la dimensione dipende da quanta roba intendi metterci.

coll. permanente

ha risposto 23 Dic '13, 16:58

enzotib's gravatar image

enzotib ♦♦
14.0k112186

Grazie mille! A volte la soluzione è più facile di non quanto sembri a prima vista! Grazie ancora

(23 Dic '13, 17:51) vale_glr vale_glr's gravatar image

@vale_glr: se la risposta ti è servita dovresti accettarla, cliccando sul simbolo di spunta accanto alla stessa, e se vuoi anche dandole un voto positivo, grazie.

(23 Dic '13, 18:11) enzotib ♦♦ enzotib's gravatar image

scusami non lo sapevo! rimedio subito!

(26 Dic '13, 19:27) vale_glr vale_glr's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×22

domanda posta: 23 Dic '13, 16:31

domanda visualizzata: 1,303 volte

ultimo aggiornamento: 26 Dic '13, 19:27

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.