Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    24

    [C] PROBLEMA "cat: cannot open argv[1]"

    Ciao a tutti,

    qui di seguito il codice da me fatto per leggere un file di testo, composto da piu' righe (il numero delle righe non e' mai fisso) e da 11 colonne.
    Con questo codice voglio leggere ciascuna riga del file, estrarne solo determinate colonne e stamparle a video.

    Il mio problema e' questo. Nella riga indicata in rosso, ho indicato "cat argv[1]" ma quando eseguo la mia procedura, ricevo il messaggio d'errore mostrato nel titolo. Dove sto sbagliando?

    Grazie a tutti

    codice:
    #include<stdlib.h>
    #include<stdio.h>
    
    main(int argc , char *argv[]){
    
      FILE *filemch;
      char buf[200];
      char *res;
      char comando[500];
      char val1[200];
    
    if(argc!=2)
    {
            printf("Syntax: procedura file_name.mch\n");
            exit(1);
    }
    
            /* veifica che il file sia presente nel direttorio */
    sprintf(comando,"test -f %s",argv[1]);
    if(system(comando)!=0)
    {
            printf("The file %s does not exist\n",argv[1]);
            exit(1);
    }
    
    		/* apre il file */
      filemch=popen("cat  argv[1]  | awk ' { print $2,$3,$4,$7,$9} '", "r")   
    if( filemch==NULL ) {
        perror("Errore in apertura del file");
        exit(1);
      }
    
    
    		/* legge e stampa ogni riga */
      while(1) {
        res=fgets(buf, 200, filemch);
        if( res==NULL )
          break;
        printf("%s", buf);
      }
    
    
    		/* chiude il file */
      fclose(filemch);
    
      return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [C] PROBLEMA "cat: cannot open argv[1]"

    Originariamente inviato da 71lucky
    codice:
    		/* apre il file */
      filemch=popen("cat  argv[1]  | awk ' { print $2,$3,$4,$7,$9} '", "r")
    Dove sto sbagliando?
    Sbagli a passare argv[1]: per come hai scritto tu stai passando "argv[1]" come nome del file e non il contenuto! Usa sprintf() per creare la stringa correttamente, espandendo il contenuto di argv[1]
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    24
    Grazie Alex della risposta.

    seguendo il tuo consiglio, ho risolto sostituendo la mia riga in rosso, con questo:

    codice:
    char comandoc[500];
    
    sprintf(comandoc,"cat %s | awk ' { print $2,$3,$4,$7,$9} '",argv[1]);
    filemch=popen(comandoc, "r");
    ed ora funziona correttamente

    Vi disturbo solo per un altro problemino, sempre su questo codice che ho scritto.
    Il file "filemch" che viene creato e' composto da informazioni di questo tipo:

    -12375 0 0 5 13900
    12375 0 0 5 13900
    0 13905 0 12380 5
    0 -13905 0 12380 5
    -690 -7200 90 400 640
    -2070 -8100 90 400 640
    -690 -8100 90 400 640
    -690 -9900 90 400 640
    -690 -9000 90 400 640
    ...............................
    ..............................

    Come ho detto prima il numero di colonne e' fisso mentre il numero di righe non e' definito.
    Come si fa' ad assegnare ad ogni singolo campo delle 5 colonne (su ciascuna riga ovviamente) una stringa definita?

    Ho letto nel forum (e in internet in generale), che si dovrebbe utilizzare, anche in questo caso sprintf(), ma non ho capito come fare ad estrarre il singolo valore di una colonna.

    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da 71lucky
    Grazie Alex della risposta.
    Prego

    Originariamente inviato da 71lucky Come ho detto prima il numero di colonne e' fisso mentre il numero di righe non e' definito.
    Come si fa' ad assegnare ad ogni singolo campo delle 5 colonne (su ciascuna riga ovviamente) una stringa definita?

    Ho letto nel forum (e in internet in generale), che si dovrebbe utilizzare, anche in questo caso sprintf(), ma non ho capito come fare ad estrarre il singolo valore di una colonna.

    Grazie ancora
    Se ogni riga contiene SEMPRE 5 interi, puoi usare fscanf. Una cosa del genere:

    codice:
    int interi[5];
    fscanf(filemch, "%d %d %d %d %d", &interi[0], &interi[1], &interi[2], &interi[3], &interi[4]);
    Per leggere tutto il file è sufficiente un ciclo, iterando sul valore restituito da fscanf()
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    24
    Grazie ancora!!

    In questi casi e' meglio usare il ciclo for oppure il ciclo while?

    Con quale criterio e' possibile fare la scelta piu' opportuna?

    ciao

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da 71lucky
    Grazie ancora!!

    In questi casi e' meglio usare il ciclo for oppure il ciclo while?

    Con quale criterio e' possibile fare la scelta piu' opportuna?

    ciao
    Il for andrebbe usato quando sai esattamente quante iterazioni fare.
    Es: for (int i = 0; i < 100; i++) { ... }

    Il while/do-while quando invece il numero di iterazioni non è noto a priori.
    Es.: while (x != y) { ... }

    In C for e while sono esattamente equivalenti e li puoi usare come preferisci. In altri linguaggi (come Pascal) il for e while sono cose ben diverse invece.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.