Entra

View Full Version : [C] Passare file come input


Fabietto206
04-02-2010, 15:15
Ho il seguente main nel progetto:
int main(int argc, char * argv[]){

// Variabili locali alla procedura main
char* hobby;
char ch='\0';
char temp;
int x, y, n;
int a, b;
rbnode *nodo = NULL;
int tmp;
char str [ 100 ];
FILE * pFile = NULL;

// per default input da tastiera
bool FlgInputFile = false;

// Costruisco Heap sort per contenere coppie di
// potenziali amici
heapPotAmic = constructHeapTD(MAX_DIM_INI);

// Inizializzo struttura ultima amicizia
// attulmente nessuna
UltimaAmicizia.m1 = -1;
UltimaAmicizia.m2 = -1;
UltimaAmicizia.nhobby -1;

// Inizializzo rappresentante attualmente nessuno
RapCampus.m = - 1;
RapCampus.voti = - 1;

// verifico tipo di input se da file o da tastiera
if (argv[1] != NULL)
{
// Verifico se abilitate input da file
pFile = fopen (argv[1], "r");
if (pFile != NULL)
FlgInputFile = true;
}

do {
// verifico se leggere comando da file o tastiera
if ( ! FlgInputFile)
ch = getchar();
else
{
fscanf (pFile, "%s", str);
ch = *(&str[0]);
}

switch(ch) {

// Eventi
// Inserisci puffo nel campus
case 'I':

// input da file o da tastiera
if (! FlgInputFile)
{
while(isspace(temp = getchar()));
hobby = Inserimento(temp);
// Nuovo puffo con i suoi hobby
inserisciPuffo(hobby);
}
else
{
fscanf (pFile, "%s", str);
inserisciPuffo(str);
}

break;

// Lezione
case 'L':

// Input da file o da tastiera
if (! FlgInputFile)
{
scanf("%d",&x); // matricola puffo x
scanf("%d",&y); // matricola puffo y
}
else
{
fscanf(pFile, "%d",&x); // matricola puffo x
fscanf(pFile, "%d",&y); // matricola puffo y
}

// Inserisco conoscenza creata a lezione se non stata
// già inserita
if ( ! IsConoScenza (x, y) )
InserisciConoScenza(x, y);
break;

// Funzione feste
case 'W':

// input da file o da tastiera
if (! FlgInputFile)
scanf("%d",&n); // numero di feste
else
fscanf(pFile, "%d",&n);

// Genero nuove coppie di amici in base al numero di feste
EseguiFeste (n);
break;

// Funzione feste
case 'E':

// Funzione per eleggere il nuovo rappresentante del campus
// in base ai puffi presenti attualmente
EleggiRappresentante();
break;

// fine eventi

// Domanda numero puffi
case 'N':
printf("N: %d \n" , ContMatricola);
break;

// Numero di Hobby
case 'H':

// input da file o da tastiera
if (! FlgInputFile)
{
scanf("%d",&x); // matricola puffo x
scanf("%d",&y); // matricola puffo y
}
else
{
fscanf(pFile, "%d",&x); // matricola puffo x
fscanf(pFile, "%d",&y); // matricola puffo y
}

// Calcolo numero di hobby in comune
tmp = NumHobbyCondivisi(x, y);
printf("H %d %d : %d \n" , x,y, tmp);
break;

// Domanda quale dei due
case 'Q':

// input da file o da tastiera
if (! FlgInputFile)
{
scanf("%d",&x); // matricola puffo x
scanf("%d",&a); // matricola puffo a
scanf("%d",&b); // matricola puffo y
}
else
{
fscanf(pFile,"%d",&x); // matricola puffo x
fscanf(pFile,"%d",&a); // matricola puffo a
fscanf(pFile,"%d",&b); // matricola puffo y
}

// Analizza se x farebbe amicizia con il puffo a o b
// oppure con nessuno
tmp = QualeDeiDuePuffi(x, a, b);
if (tmp == 1)
printf("Q %d %d %d : A \n",x,a,b);
else if (tmp == 2)
printf("Q %d %d %d : B \n" ,x,a,b);
else
printf("Q %d %d %d :\n",x,a,b);
break;

// Domanda ultima
case 'U':

// Verifico di avere l'ultima amicizia
if (UltimaAmicizia.nhobby > 0)
printf("U: %d %d %d \n" , UltimaAmicizia.m1 ,
UltimaAmicizia.m2 , UltimaAmicizia.nhobby);
else
printf("U:\n");
break;

// Domanda quante amicize
case 'A':
printf("A: %d \n" , TotAmicizieCampus);
break;

// Domanda popolarità
case 'P':
// input da file o da tastiera
if (! FlgInputFile)
scanf("%d",&x); // matricola puffo x
else
fscanf(pFile, "%d",&x); // matricola puffo x

tmp = PopolaritaPuffo(x);
printf("P %d : %d \n" , x, tmp);
break;

// Domanda Conoscenti
case 'C':

// input da file o da tastiera
if (! FlgInputFile)
{
scanf("%d",&x); // matricola puffo x
scanf("%d",&y); // matricola puffo y
}
else
{
fscanf(pFile, "%d",&x); // matricola puffo x
fscanf(pFile, "%d",&y); // matricola puffo y
}

// Verifico se x e y sono conoscenti
if ( IsConoScenza(x, y))
printf("C %d %d : S \n", x, y);
else
printf("C %d %d : N \n", x, y);

break;

// Domanda Rappresentante
case 'R':
// Verifico se stato eleltto un rappresentante
if (RapCampus.voti > 0)
printf("R: %d %d \n" , RapCampus.m , RapCampus.voti);
else
printf("R: -1 \n");
break;


/*stampa puffi usato per debug*/
case 's':
stampaPuffi();
break;

default:
break;
}

}
while(ch != 'F');

// chiduo eventuale file
if (FlgInputFile)
fclose(pFile);

// fine programma
printf("\nFine operazioni primi INVIO per terminare ");
getchar ();

}

ho una serie di test (scritti il file .txt) da fargli eseguire. Sapete come fare x passarli al programma come input?? Xkè non riesco....
In modo tale da non dovermeli scrivere tutti a mano nella finestrella nera....

wisher
04-02-2010, 20:51
Guarda qui http://www.pluto.it/files/ildp/traduzioni/learnCLI/learnCLI-7.html

Fabietto206
04-02-2010, 21:00
Ho provato a fare
sort < nomefile.txt
ma nn funziona!! Ho messo il file di testo nella stessa cartella in cui ho il file .c

wingman87
05-02-2010, 01:11
Cosa c'è scritto sul file txt?
Cosa succede quando avvii il programma in quel modo?

Fabietto206
05-02-2010, 20:06
Ecco un esempio di quello che c'è scritto in uno dei file txt ke ho:
I qyc
I qwery
I qwyry
W 3
I asd
I asm
I afghh
W 12
N
A
F

sono dei test da dare come input a un programmino e ke devono ridare a video dei risultati

Perseverance
05-02-2010, 20:10
Semplicemente fai una funzione che prende la path del file e poi estrae da se i comandi!

wingman87
06-02-2010, 00:07
Ecco un esempio di quello che c'è scritto in uno dei file txt ke ho:
I qyc
I qwery
I qwyry
W 3
I asd
I asm
I afghh
W 12
N
A
F

sono dei test da dare come input a un programmino e ke devono ridare a video dei risultati
Dando un occhio al codice che hai postato mi sembra corretto. Non riesci a localizzare in quale punto del codice si interrompe la computazione? Probabilmente il problema è in una di quelle funzioni che richiami ma di cui non hai fornito il codice.
Inoltre ti do un consiglio: invece di distinguere ogni volta tra lettura da file/lettura da tastiera setta inizialmente pFile=stdin e usa sempre fscanf.

Fabietto206
06-02-2010, 13:44
Scusami ma non capisco dove mettere le mani, mi puoi aiutare dicendomi dove devo scrivere fscanf nel mio main ke ho scritto nel primo messaggio della discussione??

wingman87
06-02-2010, 13:50
Scusami ma non capisco dove mettere le mani, mi puoi aiutare dicendomi dove devo scrivere fscanf nel mio main ke ho scritto nel primo messaggio della discussione??
Ti riferisci al mio consiglio? Non è una soluzione al problema, è solo per rendere il codice più leggibile.

FILE * pFile = stdin; //Se è stato passato un nome di file come argomento pFile verrà sovrascritto, altrimenti è già impostato per leggere da tastiera

bool FlgInputFile = false; //Questa non serve più, quindi puoi eliminare tutti quegli if(FlgInputFile){...} e usare direttamente fscanf senza fare distinzioni tra input da file o da tastiera

Fabietto206
06-02-2010, 14:23
Dici ke è giusto così:
int main(int argc, char * argv[]){

Titolo();

// Variabili locali alla procedura main
char* hobby;
char ch='\0';
char temp;
int x, y, n;
int a, b;
rbnode *nodo = NULL;
int tmp;
char str [ 100 ];
FILE * pFile = stdin;


// Costruisco Heap sort per contenere coppie di
// potenziali amici
heapPotAmic = constructHeapTD(MAX_DIM_INI);

// Inizializzo struttura ultima amicizia
// attulmente nessuna
UltimaAmicizia.m1 = -1;
UltimaAmicizia.m2 = -1;
UltimaAmicizia.nhobby -1;

// Inizializzo rappresentante attualmente nessuno
RapCampus.m = - 1;
RapCampus.voti = - 1;

// verifico tipo di input se da file o da tastiera
if (argv[1] != NULL)
// Verifico se abilitate input da file
pFile = fopen (argv[1], "r");

do {
fscanf (pFile, "%s", str);
ch = *(&str[0]);

switch(ch) {

// Eventi
// Inserisci puffo nel campus
case 'I':

fscanf (pFile, "%s", str);
inserisciPuffo(str);

break;

// Lezione
case 'L':

fscanf(pFile, "%d",&x); // matricola puffo x
fscanf(pFile, "%d",&y); // matricola puffo y

// Inserisco conoscenza creata a lezione se non stata
// già inserita
if ( ! IsConoScenza (x, y) )
InserisciConoScenza(x, y);
break;

// Funzione feste
case 'W':

fscanf(pFile, "%d",&n);

// Genero nuove coppie di amici in base al numero di feste
EseguiFeste (n);
break;

// Funzione feste
case 'E':

// Funzione per eleggere il nuovo rappresentante del campus
// in base ai puffi presenti attualmente
EleggiRappresentante();
break;

// fine eventi

// Domanda numero puffi
case 'N':
printf("N: %d \n" , ContMatricola);
break;

// Numero di Hobby
case 'H':

fscanf(pFile, "%d",&x); // matricola puffo x
fscanf(pFile, "%d",&y); // matricola puffo y

// Calcolo numero di hobby in comune
tmp = NumHobbyCondivisi(x, y);
printf("H %d %d : %d \n" , x,y, tmp);
break;

// Domanda quale dei due
case 'Q':

fscanf(pFile,"%d",&x); // matricola puffo x
fscanf(pFile,"%d",&a); // matricola puffo a
fscanf(pFile,"%d",&b); // matricola puffo y

// Analizza se x farebbe amicizia con il puffo a o b
// oppure con nessuno
tmp = QualeDeiDuePuffi(x, a, b);
if (tmp == 1)
printf("Q %d %d %d : A \n",x,a,b);
else if (tmp == 2)
printf("Q %d %d %d : B \n" ,x,a,b);
else
printf("Q %d %d %d :\n",x,a,b);
break;

// Domanda ultima
case 'U':

// Verifico di avere l'ultima amicizia
if (UltimaAmicizia.nhobby > 0)
printf("U: %d %d %d \n" , UltimaAmicizia.m1 ,
UltimaAmicizia.m2 , UltimaAmicizia.nhobby);
else
printf("U:\n");
break;

// Domanda quante amicize
case 'A':
printf("A: %d \n" , TotAmicizieCampus);
break;

// Domanda popolarità
case 'P':

fscanf(pFile, "%d",&x); // matricola puffo x

tmp = PopolaritaPuffo(x);
printf("P %d : %d \n" , x, tmp);
break;

// Domanda Conoscenti
case 'C':

fscanf(pFile, "%d",&x); // matricola puffo x
fscanf(pFile, "%d",&y); // matricola puffo y

// Verifico se x e y sono conoscenti
if ( IsConoScenza(x, y))
printf("C %d %d : S \n", x, y);
else
printf("C %d %d : N \n", x, y);

break;

// Domanda Rappresentante
case 'R':
// Verifico se stato eleltto un rappresentante
if (RapCampus.voti > 0)
printf("R: %d %d \n" , RapCampus.m , RapCampus.voti);
else
printf("R: -1 \n");
break;


/*stampa puffi usato per debug*/
case 's':
stampaPuffi();
break;

default:
break;
}

}
while(ch != 'F');

// chiudo file
fclose(pFile);

// fine programma
printf("\nFine operazioni premi INVIO per terminare ");
getchar ();

}
E poi come faccio a dirgli dove e quale file prendere??

wingman87
06-02-2010, 14:58
Mi sembra corretto, però ovviamente non lo posso provare...
Per eseguirlo semplicemente:
nomeprogramma nomefileinput
oppure
nomeprogramma
oppure
nomeprogramma < nomefileinput
Nel primo caso il tuo programma apre il file e lo legge, nel secondo inserisci i comandi da tastiera, nel terzo il contenuto di nomefileinput diventa lo stdin al posto della tastiera

PS: ho notato ora però che controlli se argv[1]!=NULL, secondo me è più corretto controllare se argc==2.

Fabietto206
06-02-2010, 18:13
Mi sembra corretto, però ovviamente non lo posso provare...
Per eseguirlo semplicemente:
nomeprogramma nomefileinput
oppure
nomeprogramma
oppure
nomeprogramma < nomefileinput
Nel primo caso il tuo programma apre il file e lo legge, nel secondo inserisci i comandi da tastiera, nel terzo il contenuto di nomefileinput diventa lo stdin al posto della tastiera

PS: ho notato ora però che controlli se argv[1]!=NULL, secondo me è più corretto controllare se argc==2.

Corretto in argc==2...
Questa riga di codice invece è giusta o devo cambiarla?
// Verifico se abilitate input da file
pFile = fopen (argv[1], "r");


E poi non ho capito come fare x eseguire il file txt, cioè quando faccio partire il programma mi compare una finestrella nera, li dentro cosa devo scrivere??

xkè se faccio input da tastiera è tutto ok....

wingman87
06-02-2010, 18:21
Quella riga di codice è corretta.
Penso di aver capito il tuo problema: lanci il programma dall'editor con cui lo scrivi? Per passargli il file lo devi lanciare da terminale, oppure, se il tuo editor lo permette, impostare i parametri da aggiungere quando lo esegui.
Lanciarlo da terminale è semplice, ti posizioni nella cartella del programma e poi usi uno dei 3 comandi che ti ho scritto nello scorso post

Fabietto206
06-02-2010, 19:21
Quella riga di codice è corretta.
Penso di aver capito il tuo problema: lanci il programma dall'editor con cui lo scrivi? Per passargli il file lo devi lanciare da terminale, oppure, se il tuo editor lo permette, impostare i parametri da aggiungere quando lo esegui.
Lanciarlo da terminale è semplice, ti posizioni nella cartella del programma e poi usi uno dei 3 comandi che ti ho scritto nello scorso post

Il prog. lo lancio dall'editor!!
Ho provato da terminale posizionandomi nella cartella in cui ho il programma e i file di test; ho provato a fare
progetto.c test00.txt
progetto.c < test00.txt
e non cambia nulla, mi apre semplicemente il progetto con l'editor di c...

come editor uso dev c++....

wingman87
07-02-2010, 00:57
Sì, perché hai lanciato il file .c, devi lanciare il file compilato.

Fabietto206
07-02-2010, 11:28
Funziona....6 un grande!!!

grazie mille