|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[C] problema con i file
Stavo provando a fare un programma preso dal manuale...però apparte non funzionare (compila ma non funziona bene) non capisco il perchè di alcune cose che mi sembrano strane...
Il programma dovrebbe chiedere in input il nome di un file,crearlo e scriverci dentro quello che viene immesso da tastiera finchè non si preme il tasto ? a questo punto chiude il file e termina l'esecuzione... Il codice è questo: /* KTOD Un programma di copia dalla tastiera a disco */ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ FILE *fp; // Puntatore a file char ch; // Carattere if(argc != 2){ printf("Hai dimenticato di scrivere il nome del file.\n"); exit(1); } if((fp=fopen(argv[1], "w")) == NULL){ printf("Impossibile aprire il file.\n"); exit(1); } do{ ch = getchar(); // Prendi un carattere da tastiera e mettilo in ch putch(ch, fp); }while(ch != '$'); fclose(fp); return 0; } Non capisco perchè in questa riga: int main(int argc, char *argv[]){ vengono passati degli argomenti al main...che sono?che significano? e prechè non funziona ? copiato pari pari dal manuale.... Grazie |
![]() |
![]() |
![]() |
#2 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Il programma non chiede in input il nome di un file ma VUOLE in input il nome del file. Non ho compilato e eseguito, ma noto che questa potrebbe essere la prima causa del tuo problema. Nella riga del main(), argc identifica il numero di argomenti passati al programma mentre argv e' un array di stringhe, che contiene appunto i parametri passati al programma. Inoltre la funzione putch() non so da dove provenga, ma non e' affatto standard. Sostituiscila con putc(). In ultimo, il programma termina la sua esecuzione una volta digitato il carattere '$' e non '?'. |
|
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
ok..ma allora come glielo dò in input il nome del file..dove glielo devo mettere?
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
nei sorgenti poi lo leggi accedendo ad argv[1] ciao ![]() |
|
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Con "difatti" intendo che non è standard ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
la funzione main ha dei parametri impliciti. questi parametri sono i parametri che tu passi da riga di comando al programma. ad esempio quando compili un programma (con il compilatore gcc) scrivi una cosa del tipo:
gcc nomeprogramma.c oppure gcc nomeprogramma.c -o programma come fa il compilatore gcc a sapere quali dati gli hai passato come parametro? i parametri passati da linea di comando al programma sono i parametri del main. il main ha 2 parametri (veramente non sono sempre 2, cmq assumiamone 2) di cui: - il primo è un intero (che puoi chiamare come ti pare, basta che la dichiari come intero) che indica il numero di parametri che hai passato. questo numero è sempre maggiore o uguale a 1 perchèconta anche il nome del programma (es: gcc nome.c -o ciao, qui la variabile conterrà il valore 4) - il secondo è un array di stringhe (cioè un array di array di char) dove ogni stringa è un parametro che hai passato al programma es: gcc nome.c -o ciao argc --> 4 argv[0] --> gcc argv[1] --> nome.c argv[2] --> -o argv[3] --> ciao P.S. quando ho premuto Rispondi ancora non erano state date risposte... ![]() |
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
char *argv[] perchè tanto argv è un puntatore al primo elemento dell'array, mettendoci un * è puntatore a puntatore perchè punta ad un array di array...giusto? |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
|
|
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Che poi scusa, quale manuale?
Esiste sul pianeta un manuale che presenti come esempio uno schifo di codice del genere? Addirittura include nel file da scrivere il carattere terminatore, che invece non dovrebbe essere scritto. Questa versione, invece, conclude senza includere il carattere terminatore: Codice:
#include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { FILE *fp; char ch; if (argc != 2) { printf("Hai dimenticato di scrivere il nome del file.\n"); exit(1); } if ((fp=fopen(argv[1], "w")) == NULL) { printf("Impossibile aprire il file.\n"); exit(1); } while (ch != '$') { putc(ch, fp); ch = getchar(); }; fclose(fp); return 0; } |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Codice:
while ((ch = getchar ()) != '$') putc (ch, fp); ![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
int putch(int c)
scrive un carattere su stdout Ultima modifica di VegetaSSJ5 : 04-05-2005 alle 17:59. |
![]() |
![]() |
![]() |
#14 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Anche il C ogni tanto si aggiorna, eh! |
|
![]() |
![]() |
![]() |
#15 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Praticamente la copia della funzione standard putchar() che gia' e' ridondante perche' ha il comportamento di putc(ch, stdout). Come aumentare il footprint delle librerie in modo inutile e controverso. |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
![]() ciao ![]() |
|
![]() |
![]() |
![]() |
#17 | ||
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
gcc -Wall -g -o prova prova.c e avviando il debugger con: gdb --readnow prova Quote:
|
||
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao ![]() |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
mi autonomino giudice della situazione...
![]() vicius e mjordan che compilatori usate?? (compilatore, versione, sistema operativo) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:39.