Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194

    Problema con lettura file

    Ciao,
    prima di tutto ecco il codice:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(int argc, char* argv[])
    {
    	FILE *fp;
    	char stringa[] = "ciao\n";
    	int i, cont;
    
    	/* inizializzazione file */
    	fp = fopen("prova.txt", "w");
    	i = 0;
    	fprintf(fp, "%d \n", i);
    	fclose(fp);
    
    	/* aggiunta nuova stringa e aggiornamento contatore stringhe presenti nel file */
    	fp=fopen("prova.txt", "a");
    	fputs(stringa, fp);
    	rewind(fp);
    	fscanf(fp, "%d", &cont);
            printf("cont=%d\n", cont);
    	cont++;
            rewind(fp);
    	fprintf(fp, "%d", cont);
    	fclose(fp);
    
    	return 0;
    }
    Non state a vedere la mancanza di controlli o il perchè apro il file due volte in quanto questo è solo un frammento di codice di un programma più complesso. Quello che voglio riuscire a fare è questo:
    1) Inizializzare un file salvandoci il valore di una variabile che mi servirà come contatore per capire quante stringhe ci sono nel file. Ogni stringa occupa una riga del file.
    2) Scrivere una nuova stringa e andare ad aggiornare il valore del contatore.

    Il problema sta nella fscanf che non mi legge un valore corretto pur essendomi posizionato (a me pare) nella giusta posizione del file.
    Dove sbaglio?
    "There is no dark side of the moon really. Matter of fact it’s all dark."

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Problema con lettura file

    Originariamente inviato da sky_451
    Il problema sta nella fscanf che non mi legge un valore corretto pur essendomi posizionato (a me pare) nella giusta posizione del file.
    Dove sbaglio?
    Quando si apre un file con la fopen usando le modalità di apertura "a" o "a+", le scritture avvengono sempre al fondo del file. Se anche sposti la posizione all'inizio o in mezzo al file, la posizione viene rimessa in automatico al fondo del file quando si effettua una scrittura. Quindi con "a" o "a+" non è possibile sovrascrivere dei dati nel file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Io comunque farei così:
    codice:
    #include <stdio.h>
    
    int aggiungi_stringa (FILE *f, char *str)
    {
        int count;
    
        if (fseek (f, 0L, SEEK_SET) != 0)
            return 0;
    
        if (fscanf (f, "%d", &count) != 1)
            count = 0;
    
        if (fseek (f, 0L, SEEK_SET) != 0)
            return 0;
    
        fprintf (f, "%010d\n", ++count);
    
        if (fseek (f, 0L, SEEK_END) != 0)
            return 0;
    
        fprintf (f, "%s\n", str);
    
        return 1;
    }
    
    
    int main (void)
    {
        FILE *f;
    
        /* Si assicura che il file esista! */
        if ((f = fopen ("prova.txt", "a")) != NULL)
            fclose (f);
    
        /* Aggiunge delle stringhe */
        if ((f = fopen ("prova.txt", "r+")) != NULL)
        {
            aggiungi_stringa (f, "ciao");
            aggiungi_stringa (f, "hello");
            aggiungi_stringa (f, "andbin");
            aggiungi_stringa (f, "test");
    
            fclose (f);
        }
    
        return 0;
    }
    Nota 1: non ho messo i controlli sui valori di ritorno delle aggiungi_stringa().
    Nota 2: non ha la pretesa di essere perfetto! Si può sicuramente migliorare il test sulla fscanf e mettere il test sulle fprintf.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ti consiglio queste modifiche

    codice:
       /* inizializzazione file */
       ...
       fprintf(fp, "%06d \n", i);  // Determina un numero fisso di cifre
       ...
    
       /* aggiunta nuova stringa e aggiornamento contatore stringhe presenti nel file */
       fp=fopen("prova.txt", "r+");  // File in r+
       fscanf(fp, "%d", &cont);
       rewind(fp);
       fprintf(fp, "%06d", ++cont);
       fseek(fp, 0L, SEEK_END);
       fputs(stringa, fp);
       fclose(fp);

  5. #5
    Utente di HTML.it L'avatar di sky_451
    Registrato dal
    Apr 2003
    Messaggi
    194
    Ringrazio tutti due. Io avevo QUASI risolto così (anche se sicuramente le vostre soluzioni sono migliori e funzionano).
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main(int argc, char* argv[])
    {
    	FILE *fp;
    	char stringa[] = "ciao\n";
    	int cont=0, i;
    	char ch;
    	char s_contatore[10];
    
    	/* inizializzazione file */
    	fp = fopen("prova.txt", "w");
    	fprintf(fp, "%d\n", cont);
    	fclose(fp);
    
    	/* aggiunta nuova stringa e aggiornamento contatore stringhe presenti nel file */
    	fp=fopen("prova.txt", "a");
    	fputs(stringa, fp);
    	rewind(fp);
    	i = 0;
    	while( ((ch = fgetc(fp)) != '\n') && (i < 10) )
    	{
    		s_contatore[i] = ch;
    		i++;
    	}
    	s_contatore[i] = '\0';
    	cont = atoi(s_contatore);
    	printf("%d", cont);
    
    	cont++;
    	rewind(fp);
    	fprintf(fp, "%d\n", cont);
    	fclose(fp);
    
    	return 0;
    }
    In questo codice c'è comunque ancora il problema fatto notare da andbin (quello della rewind).
    Proverò uno dei vostri suggerimenti.
    Vi ringrazio ancora.
    "There is no dark side of the moon really. Matter of fact it’s all dark."

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.