PDA

Visualizza la versione completa : [C/C++]: Leggere 3 numeri alla volta da un file


xfer345
19-08-2006, 17:15
Ciao ragazzi, potreste aiutarmi a risolvere questo problema, x favore?

"Scrivere un programma che legge da un file di testo denominato "dati.txt"
tre numeri interi per volta, li somma e stampa il risultato a video. Il file
"dati.txt" contiene un numero di elementi multiplo di 3. "

Il problema è che non so come fare a fargli leggere 3 numeri alla volta!!!
Aiutatemi x favore !!!

Grazie

Fabio

U-bahn
19-08-2006, 18:28
potresti usare fscanf, ad esempio...:D

Samuele_70
19-08-2006, 18:28
Ma quanti 3d hai creato :biifu: ?

Potresti usare la fscanf()

es:

int val1, val2, val3;
fscanf( fp, "%d", &val1);
fscanf( fp, "%d", &val2);
fscanf( fp, "%d", &val3);

e poi sommi i tre valori.

U-bahn
19-08-2006, 18:46
int val1, val2, val3;
fscanf( fp, "%d", &val1);
fscanf( fp, "%d", &val2);
fscanf( fp, "%d", &val3);
:confused:

fscanf(fp, "%d%d%d", &val1, &val2, &val3); :dottò:

:D

Samuele_70
19-08-2006, 18:59
Originariamente inviato da U-bahn
:confused:

fscanf(fp, "%d%d%d", &val1, &val2, &val3); :dottò:

:D

Le preferisco separate, permettono una gestione degli errori più accurata,
del tipo : Manca il secondo valore intero, oppure manca il terzo... :unz:

xfer345
19-08-2006, 20:13
Eh ma così è troppo facile!!! In questo modo legge i primi tre elementi del file...il programma invece chiede di leggere i primi tre file e farne la somma, poi leggere dal 4° al 6° file e farne la somma, e cosi via (ovviamente senza sapere a priori da quanti elementi è formato il file (l'importante è che sia un multiplo di 12)).
Se riuscite a risolverlo così...vi ringrazio davvero!!!
Ciao
Fabio

U-bahn
19-08-2006, 20:59
Eh ma così è troppo facile!!! In questo modo legge i primi tre elementi del file...il programma invece chiede di leggere i primi tre file e farne la somma:dottò: :incupito:


#include <stdio.h>
#include <assert.h>

int main(int argc, char **argv)
{
int n1, n2, n3;
FILE *fdat;

assert(argc == 2);
fdat = fopen(argv[1], "r");
assert(fdat != NULL);

while (fscanf(fdat, "%d%d%d", &n1, &n2, &n3) == 3) {
printf("%5s%4d%5s%4d%5s%4d%6s%4d\n",
"N1:", n1, "N2:", n2,
"N3:", n3, "Sum:", n1 + n2 + n3);
}

if (fclose(fdat) != 0)
return 1;
return 0;
}

:madai!?:

xfer345
19-08-2006, 21:08
Grazie 1000!!!
Potresti però spiegarmi a parole il meccanismo in:
while (fscanf(fdat, "%d%d%d", &n1, &n2, &n3) == 3) {
printf("%5s%4d%5s%4d%5s%4d%6s%4d\n",
"N1:", n1, "N2:", n2,
"N3:", n3, "Sum:", n1 + n2 + n3);

Non ho capito molto bene come funziona..dopo che ha fatto la somma dei primi tre numeri, come fa a riniziare dal 4° e sommare fino al 6° e così via?
Se me lo puoi spiegare a parole....davvero grazie

Fabio

xfer345
19-08-2006, 21:17
Originariamente inviato da U-bahn
:dottò: :incupito:


#include <stdio.h>
#include <assert.h>

int main(int argc, char **argv)
{
int n1, n2, n3;
FILE *fdat;

assert(argc == 2);
fdat = fopen(argv[1], "r");
assert(fdat != NULL);

while (fscanf(fdat, "%d%d%d", &n1, &n2, &n3) == 3) {
printf("%5s%4d%5s%4d%5s%4d%6s%4d\n",
"N1:", n1, "N2:", n2,
"N3:", n3, "Sum:", n1 + n2 + n3);
}

if (fclose(fdat) != 0)
return 1;
return 0;
}

:madai!?:

Non capisco bene cosa fa soprattutto (perchè ==3?) nel while e nella printf contenuta nel while...%5s%4d...cosa significano?
Scusa l'ignoranza, ma ti prego fammi capire!!!
Grazie ancora
Fabio

U-bahn
20-08-2006, 15:20
questo:


while (fscanf(fdat, "%d%d%d", &n1, &n2, &n3) == 3) {
printf("%5s%4d%5s%4d%5s%4d%6s%4d\n",
"N1:", n1, "N2:", n2,
"N3:", n3, "Sum:", n1 + n2 + n3);
}


significa:


finchè fscan restituisce un valore pari a 3
stampa "N1: n1 N2: n2 N3: n3 Sum: n1+n2+n3"


Il valore di ritorno di fscanf ha un significato ben preciso:
se stai studiando su di un libro, quasi certamente questo contiene
la spiegazione delle varie funzioni della libreria standard.
Il suo utilizzo con == 3 garantisce che siano letti 3 numeri
convertibili a int; così se, ad esempio, il file contiene
13 numeri, l'ultimo viene sì letto, ma il ciclo non viene eseguito.

Nella printf %5s significa: il parametro corrispondente deve
essere stampato come se fosse una stringa, con un campo
di caratteri pari a 5; %4d vuol dire la stessa cosa, solo
che il parametro corrispondente viene stampato come un int
e con un campo di 4 caratteri.
Per farti capire:


printf("%10s%10s%10s", "Hello", "world", "!!!");
stampa:
Hello world !!!

:ciauz:

Loading