Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    14

    [C] chiarimento fopen()

    rieccomi ciao a tutti.
    dopo aver letto alcune guide sono passato al I/O su file e avrei alcune domande:
    1° a cosa serve la parola FILE
    codice:
    int main (){
        FILE *num , *fopen();
    int risultato,x,i;
    num = fopen ("numeri.txt","w");
    if ((num=fopen("numeri.txt","w"))==NULL) printf("\nerrore apertura file\n");
    printf("inserisci il numero fino a dove vuoi calcolare i numeri primi\n");
    scanf("%d",&x);
    printf("\ni numeri primi sono\n");
    for (i=1 ; i<=x; i++){
    risultato = Primo(i);
    if (risultato == 1){
                   printf("%d\t",i);
                   fprintf (num, "%d\n", i);}
    }
    fclose(num);
    getchar();
    2° come mai nel secondo esempio di codice non scrive nulla sul file ma lo apre o almeno non dice il contrario?
    codice:
      int main (){
    int risultato,x,i;
    FILE *num = fopen ("numeri.txt","w");
    if (num=NULL) printf("\nerrore apertura file\n");
    printf("inserisci il numero fino a dove vuoi calcolare i numeri primi\n");
    scanf("%d",&x);
    printf("\ni numeri primi sono\n");
    for (i=1 ; i<=x; i++){
    risultato = Primo(i);
    if (risultato == 1){
                   printf("%d\t",i);
                   fprintf (num, "%d\n", i);}
    }
    fclose(num);
    getchar();
    ho cercato in rete ma non mi è molto chiaro
    grazie gip

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    La parola chiave FILE indica il tipo di variabile,un puntatore a file se aperto correttamente indica l' indirizzo di memoria del file sul disco (se non erro),ma serve appunto per eseguire il controllo che il file sia stato aperto correttamente,perchè se è così punta a NULL.
    Invece di:

    codice:
    if ((num=fopen("numeri.txt","w"))==NULL) printf("\nerrore apertura file\n");
    Puoi scrivere:

    codice:
    if(num==NULL)
      printf("errore");
    Ti sarai reso conto che un puntatore a file funziona come un normalissimo puntatore,punta a NULL se non punta a un file aperto.
    Poi comunque per aprire il file ci sono i vari permessi,quando lo apri in lettura te lo riscrive da zero,lo puoi aprire in varie modalità.
    Ecco qua un aiuto: http://www.cplusplus.com/reference/c.../cstdio/fopen/
    Poi per le funzioni di lettura/scrittura (fscanf,fprintf,ecc...) cercale sempre su c++ reference (pardon se lo sapevi già ).

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    14
    grazie la parola FILE è una parola chiave ok capito
    ho modificato il mio codice che non stampava su file da
    codice:
    if (num=NULL) printf ("errore");
    a
    codice:
    if (num==NULL) printf("errore");
    e adesso salva i dati su file perchè?
    la riga di codice, nel primo listato,

    codice:
    FILE *num, *fopen()
    l'asterisco e la funzione (correggimi se il termine è errato) fopen() non serve giusto?

    gip

  4. #4
    Originariamente inviato da ramy89
    La parola chiave FILE indica il tipo di variabile,un puntatore a file se aperto correttamente indica l' indirizzo di memoria del file sul disco (se non erro),
    Giusto per puntualizzare: punta ad una struttura in cui la libreria standard C memorizza diverse informazioni relative allo stato del file (posizione al suo interno, handle del sistema al file, eccetera). Tuttavia, è una struttura "opaca", nel senso che non la si può modificare direttamente, ma solo tramite le funzioni di IO. Si può dire che ciascun FILE * identifica un file aperto, e questo basta.
    Originariamente inviato da gip1975
    grazie la parola FILE è una parola chiave ok capito
    ho modificato il mio codice che non stampava su file da
    codice:
    if (num=NULL) printf ("errore");
    a
    codice:
    if (num==NULL) printf("errore");
    e adesso salva i dati su file perchè?
    la riga di codice, nel primo listato,
    = è l'operatore di assegnamento, per cui prima della modifica assegnavi a num il valore NULL, e per questo tutte le chiamate successive alle funzioni di IO fallivano (passavi NULL invece del FILE * che era stato restituito da fopen).
    codice:
    FILE *num, *fopen()
    l'asterisco e la funzione (correggimi se il termine è errato) fopen() non serve giusto?
    L'asterisco nella dichiarazione di num serve, mentre per la chiamata ad fopen no.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    14
    ho capito grazie mille a entrambi


    gip

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Comunque la tentazione di stampare fp era forte,se provo a stamparlo senza che punti a un file aperto mi stampa un indirizzo di memoria ma poi crasha.

    codice:
    printf("%p",fp);
    Se lo stampo mentre punta a un file aperto mi stampa l' indirizzo 756B2960

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da ramy89
    se provo a stamparlo senza che punti a un file aperto mi stampa un indirizzo di memoria ma poi crasha.
    Evidentemente crasha per qualche cosa che hai scritto dopo perché la semplice stampa del valore di un puntatore non può far crashare un programma, al massimo potrebbe capitare con la sua dereferenziazione.
    every day above ground is a good one

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Si crashava per qualche altro motivo probabilmente.
    Anche se non punta a nulla mi stampa un indirizzo.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da ramy89
    Anche se non punta a nulla mi stampa un indirizzo.
    Per lo stesso motivo per cui se stampi il valore di una variabile non inizializzata non è detto che questo sia 0. Un puntatore è esso stesso una variabile. Quei valori che leggi sono valori casuali, quelli presenti in memoria nel momento in cui viene semplicemente allocata la variabile (cioè: lo spazio per la variabile) senza che ne sia inizializzato il valore.
    every day above ground is a good one

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.