[c] Lanciare programma da linea di comando

gtsolid
ciao a tutti

Avrei un problema. per vedere se funziona, devo lanciare il programma da riga di comando. come faccio?

#include <stdio.h>
#include <stdlib.h>
#define N_AZIENDE 5
int main (int argc, char* argv[])
{
FILE *fin, *fout;
int cliente, azienda, operazione, v[N_AZIENDE], salva, totale = 0;
float qta;
if(argc != 7)
{
fprintf (stderr,"Errore nel numero di argomenti passati al programma\n");
return (-1);
}
if((fin = fopen(argv[1],"r")) == NULL)
{
fprintf (stderr,"Errore in apertura file di ingresso\n");
return (-2)
}
/* il file di output lo apriamo solo se necessario */
cliente = atoi(argv[2]);
azienda = atoi(argv[3]) - 1;
operazione = argv[4][0];
qta = atof(argv[5]);
if (argv[6][1] == ‘S’)
{
salva = 0;
}
else /* non sono previsti errori ....*/
{
salva = 1;
/* apriamo il file di output */
if((fout fopen(argv[7],"w")) == NULL)
fprintf (stderr,"Errore in apertura file di uscita\n");
}
/* tutte e tre le operazioni richiedono di scandire il file */
while(fscanf(fin,"%d %d %d %d %d %d", &cc, &q[0], &q[1], &q[2], &q[3], &q[4]) ==
6)
{
if(cc == cliente)
{
switch(operazione) {
case 'A':
q[azienda] += qta;
break;
case 'V':
q[azienda] -= qta;
break;
case 'G':
q[azienda] = q[azienda] * (1 + qta/100.0);
break;
}
}
if (salva)
{
fprintf(fout,"%d %d %d %d %d %d\n", cc, q[0], q[1], q[2], q[3], q[4]);
}
else
{
/* accumulo il totale dell’azienda, da stampare alla fine */
totale += q[azienda];
}
}
if (!salva)
{
printf(“Numero totale di azione dell’azienda %d: %4d\n”, azienda, totale);
}
fclose(fin);
if (salva)
{
fclose(fout);
}
}

Risposte
Rggb1
Banalmente, prima compili con un comando tipo
gcc -o prog prog.c
e poi esegui
./prog

Poiché la risposta è banale, immagino ci siano altre difficoltà... quali?

gtsolid
"Rggb":
Banalmente, prima compili con un comando tipo
gcc -o prog prog.c
e poi esegui
./prog

Poiché la risposta è banale, immagino ci siano altre difficoltà... quali?


ad esempio nella riga
while(fscanf(fin,"%d %d %d %d %d %d", &cc, &q[0], &q[1], &q[2], &q[3], &q[4]) == 
6)


non capisco perchè scannerizza il file fino a "6". cosa vuol dire quel 6?

Rggb1
La condizione del while rimane vera (e quindi vengono eseguite le istruzioni all'interno del while stesso) fintantoché fscanf() ritorna il valore 6.
Per altri dettagli:
man fscanf

gtsolid
"Rggb":
La condizione del while rimane vera (e quindi vengono eseguite le istruzioni all'interno del while stesso) fintantoché fscanf() ritorna il valore 6.
Per altri dettagli:
man fscanf


vuol dire che legge 6 righe?

apatriarca
No, vuol dire che legge 6 valori (i numeri contenuti nella riga).

gtsolid
"apatriarca":
No, vuol dire che legge 6 valori (i numeri contenuti nella riga).


e come faccio a dirgli di compiere la stessa operazione su tutte le righe?

Rggb1
Ehm no... vedo che non sei molto pratico di codice, cercherò quindi di essere più chiaro:

La funzione fscanf() ritorna il numero di assegnazioni (scansioni) fatte.

Ora ad essa è associata la stringa di formato nonché sei variabili. Pertanto ritorna il valore 6 se legge (nel formato) esattamente quei sei valori, ovvero finché i dati letti da file sono nella forma che ci si aspetta siano.

Se ritorna un valore diverso vuol dire che non ha letto/scansionato sei valori: è finito il file, c'è un errore...

Pertanto viene eseguito il ciclo while per tutte le volte che la funzione fscanf() ritorna 6.

gtsolid
"Rggb":
Banalmente, prima compili con un comando tipo
gcc -o prog prog.c
e poi esegui
./prog

Poiché la risposta è banale, immagino ci siano altre difficoltà... quali?


effettivamente non capisco cosa voglia dire
operazione = argv[4][0]; 


non mi torna quello [0] che negli altri argv non c'è

apatriarca
argv[4] è un puntatore e puoi quindi usare l'operatore []. In effetti il rapporto tra array e puntatori è molto stretto e, se non l'hai ancora visto, ti consiglio di farlo. Ogni libro di C dovrebbe parlarne diffusamente. Ne avevo tralaltro parlato diffusamente in un vecchio post che adesso non trovo. Se lo trovo vedo di postare il link.

EDIT: per mostrarti alcune assurdità del C (e la sua grande capacità di essere reso totalmente incomprensibile), prova ad eseguire il seguente:
#include <stdio.h>

int main()
{
    const int array[] = {1, 2, 3, 4, 5, 6, 7};
    const unsigned size = sizeof(array)/sizeof(int);
    int i;

    for (i = 2; i < size; ++i) {
        printf("%d, ", i[array] - (i-2)[array]);
    }
    puts("...come mai funziona?\n");

    return 0;
}

Ovviamente non farlo in nessun codice serio.. :)

EDIT 2: La discussione era questa. Se sfogli la discussione ad un certo punto trovi un mio post in cui spiego brevemente le differenze e le similitudini di array e puntatori e come interagiscono.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.