PDA

Visualizza la versione completa : Problema con lettura file


sky_451
19-05-2006, 15:34
Ciao,
prima di tutto ecco il 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?

andbin
19-05-2006, 16:23
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.

andbin
19-05-2006, 16:36
Io comunque farei così:

#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.

oregon
19-05-2006, 16:37
Ti consiglio queste modifiche



/* 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);

sky_451
19-05-2006, 17:01
Ringrazio tutti due. Io avevo QUASI risolto così (anche se sicuramente le vostre soluzioni sono migliori e funzionano).


#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.
:ciauz:

Loading