PDA

Visualizza la versione completa : [C] PROBLEMA "cat: cannot open argv[1]"


71lucky
04-07-2011, 11:11
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



#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;
}

Alex'87
04-07-2011, 11:32
Originariamente inviato da 71lucky


/* 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] ;)

71lucky
04-07-2011, 15:02
Grazie Alex della risposta.

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




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

Alex'87
04-07-2011, 15:41
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:


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()

71lucky
05-07-2011, 16:21
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

Alex'87
05-07-2011, 16:29
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.

Loading