PDA

View Full Version : [C] Acquisizione dati da file


Bestseller
05-12-2010, 18:28
Buonasera,
ho un problema con il linguaggio di programmazione C.

Devo creare un programma che riceve in input una sequenza di numeri interi che sono scritti su un file .txt. Per fare un esempio, il file contiene i seguenti numeri: 4 15 9 23 5 2 11 19 27 (notare lo spazio che li separa). Vorrei che questi numeri fossero presi dal programma e inseriti in una stringa.
Allora ho scritto il seguente programma:

char stringa[100];
FILE *f;

f=fopen ("nomefile.txt","r");
fscanf (f,"%s",stringa);

Il problema è che, così facendo, il programma mi prende soltanto il primo numero perchè a quanto pare lo spazio che separa i numeri funge da terminatore. Come posso fare ad acquisire tutti i numeri?
Grazie.

tuccio`
05-12-2010, 19:44
fgets legge la linea

Bestseller
05-12-2010, 20:36
ehm...puoi essere un po' più chiaro?

come e dove devo usare la funzione fgets?
Grazie

alemoppo
05-12-2010, 21:11
#include <stdio.h>

int main()
{
char linea[100];
FILE *stream;
stream = fopen("file.txt","r");
if(stream == NULL)
printf("Impossibile aprire il file!");
else
{
fgets(linea,100,stream);
printf("%s",linea);
fclose(stream);
}
return 0;
}



Ciao!

tuccio`
05-12-2010, 22:06
e poi puoi usare sscanf per leggere gli interi dalla stringa

Bestseller
06-12-2010, 14:58
Ma non c'è un metodo più semplice?

Scusate se non accetto i vostri consigli, ma siccome ho un esame non so se mi lascino usare comandi come fgets che non abbiamo visto in classe.

Ho sentito che se i numeri nel file .txt, invece di separarli l'uno dall'altro attraverso uno spazio, li scrivo uno per riga, la fscanf dovrebbe essere in grado di acquisirli. Io ho provato, ma non ci riesco. Me lo confermate anche voi?

tuccio`
06-12-2010, 15:25
dipende molto da cosa devi farci con questi numeri.. se non ti serve tenerli tutti in memoria (ad esempio devi usarli per calcolare una media, o fare qualche altro tipo di calcolo per il quale ti basta leggere un numero alla volta) puoi fare così:

(l'esempio è per calcolare la media)


double avg = 0;
int n = 0; // Numero di numeri letti
while (!feof(f))
{
int x;
fscanf(f, "%d", &x);
avg += x;
n++;
}
avg /= n;
printf("La media è %f\n", avg);

Bestseller
06-12-2010, 15:36
Forse l'esempio dei numeri è fuorviante...Supponiamo che il file contenga tre parole. Come faccio ad acquisirle tutte? Sempre con fgets?

Ti ringrazio per la tua disponibilità. Grazie davvero. Non so come farei senza il tuo aiuto.

tuccio`
06-12-2010, 16:21
puoi sempre usare fgets quando devi leggere un riga, dal momento che una volta che hai una stringa in cui hai la riga letta puoi farci un po' quello che vuoi, ad esempio dividere le parole con strtok o qualsiasi altro lavoro devi farci (leggere altri tipi di dato con sscanf ad esempio), senza avere necessità di sapere a priori quante parole devi leggere

certo, se sai che devi leggere esattamente 3 parole, puoi semplicemente fare una cosa del genere:


char buf[3][256];
int i = 0;
for (i = 0; i < 3; i++)
{
fscanf("%s", buf[i]);
}


e hai le tre parole già divise in buf[1], buf[2] e buf[3]

non c'è un modo giusto o un modo sbagliato