PDA

Visualizza la versione completa : [C] Leggere alternativamente interi da due file diversi


goatboy
13-01-2012, 10:48
Salve a tutti, ormai scrivo ogni giorno un problema diverso :dhò:
Ho un esercizio dove devo leggere dei numeri da due file diversi (ogni file ha 4 numeri) e devo creare due vettori:
- il primo vettore è costruito leggendo i numeri in posizione DISPARI del PRIMO file e PARI del secondo file
- il secondo vettore è costruito leggendo i numeri in posizione PARI del PRIMO file e in posizione DISPARI del SECONDO file

Ho scritto il codice che secondo me andava bene, ma stampa numeri a casaccio e non capisco perchè.



#include <stdio.h>

int main(){
int v1[4]; // Dispari del primo file e pari del secondo file
int v2[4]; // Pari del primo file e dispari del secondo file
FILE *f1, *f2;
int i;
// Creazione primo vettore
f1=fopen("1.txt", "r");
for(i=0; i<4; i=i+2){
fscanf(f1, "%d", &v1[i]);
}
fclose(f1);
f2=fopen("2.txt", "r");
for(i=1; i<4; i=i+2){
fscanf(f2, "%d", &v1[i]);
}
fclose(f2);
}

oregon
13-01-2012, 11:16
Proponendo subito al forum il problema senza rifletterci almeno un paio di giorni (!), non ti aiuterà ad imparare molto ...

Prima di tutto dove "visualizzi" i numeri a casaccio? E di quale vettore (dato che v2 non lo usi proprio)?

goatboy
13-01-2012, 11:19
Originariamente inviato da oregon
Proponendo subito al forum il problema senza rifletterci almeno un paio di giorni (!), non ti aiuterà ad imparare molto ...

Purtroppo ho l'esame fra 5 giorni, studio giorno per giorno e se facessi un esercizio ogni 2-3 giorni non ce la farei a prepararmi in tempo :incupito:
Il professore all'Università ci metteva tutte e 3 le ore di lezione per fare un esercizio base, perchè spiegava lentamente e in modo incomprensibile. Esercizi di questo genere li ho dovuti imparare da solo, e li capisco. Ma ogni volta che mi imbatto in un nuovo problema, ho la necessità di dover capire subito il problema perchè il tempo scorre e l'esame si avvicina. :facepalm:


Originariamente inviato da oregon
Prima di tutto dove "visualizzi" i numeri a casaccio? E di quale vettore (dato che v2 non lo usi proprio)?

Il secondo vettore non l'ho ancora usato perchè non riesco ancora a creare il primo. Li visualizzo quando vado a compilare, scrivendo così:


for(i=0; i<4; i++){
printf("%d\n", v1[i]);
}

oregon
13-01-2012, 11:22
Originariamente inviato da goatboy
Purtroppo ho l'esame fra 5 giorni, studio giorno per giorno e se facessi un esercizio ogni 2-3 giorni non ce la farei a prepararmi in tempo :incupito:

Probabilmente avresti dovuto cominciare prima a fare esercizi, ma non è questo il problema ...



Il secondo vettore non l'ho ancora usato perchè non riesco ancora a creare il primo.

Qual è un esempio concreto di contenuto dei file e cosa ti aspetti che contenga il vettore ?

goatboy
13-01-2012, 11:25
Originariamente inviato da oregon
Probabilmente avresti dovuto cominciare prima a fare esercizi, ma non è questo il problema ...

No guarda, ti assicuro che esercizi li faccio dall'inizio del corso. Rileggi la modifica del post precedente e capirai.. :dhò:


Originariamente inviato da oregon
Qual è un esempio concreto di contenuto dei file e cosa ti aspetti che contenga il vettore ?

Il primo file contiene, in colonna: 3 7 2 5
Il secondo file contiene, in colonna: 4 6 1 9
Prima uscivano numeri grandi a cavolo, poi ho aggiustato un pò e adesso mi esce: 3 4 7 6. Invece dovrebbe contenere 3 6 2 9 ..
Ma davvero non capisco perchè.. il codice non è cambiato, è sempre quello che ho postato

oregon
13-01-2012, 11:40
Allora qualcosa come




FILE *f1, *f2;
int i, dummy;

f1=fopen("1.txt", "r");
f2=fopen("2.txt", "r");
for(i=0; i<4; i++)
{
if(i%2==0)
{
fscanf(f1, "%d", &v1[i]);
fscanf(f1, "%d", &dummy);
}
else
{
fscanf(f2, "%d", &dummy);
fscanf(f2, "%d", &v1[i]);
}
}
fclose(f1);
fclose(f2);

goatboy
13-01-2012, 11:45
Così funziona, grazie :)
Perchè il mio codice non funzionava? Nel primo file la mia i aveva due valori, 0 e 2 (rispettivamente primo e terzo numero , ovvero 3 e 2).. perchè invece mi leggeva 3 e 7?

oregon
13-01-2012, 11:49
Per capire subito, dai un'occhiata a quante letture faccio dal file per ogni ciclo for e quante ne fai tu.

goatboy
13-01-2012, 11:54
Originariamente inviato da oregon
Per capire subito, dai un'occhiata a quante letture faccio dal file per ogni ciclo for e quante ne fai tu.
Ho capito :D Di sicuro non me lo scordo più! :fighet:
Grazie infinite oregon!

torn24
13-01-2012, 12:01
quando apri il file fscanf legge sempre da inizio file
quindi nel primo for leggi i primi due caratteri e le memorizzi su gli indici 0 e 2
nel secondo for leggi sempre i primi due caratteri e le memorizzi negli indici 1 e 3

io farei un ciclo for che legge da 0 <4 e memorizzo in una variabile
di appoggio esempio k e all'interno del for
inserisci tanti if e else if se i = 0 v1[i] =k
se i = 2 v1[i] =k





f1=fopen("1.txt", "r");
for(i=0; i<4;i++){
fscanf(f1, "%d", &k);
if (i==0)
v1[i] =k;
else if(i==2)
v1[i] =k;

}
fclose(f1);
f2=fopen("2.txt", "r");
for(i=0; i<4; i++){
fscanf(f2, "%d", &k);

if (i==1)
v1[i] =k;
else if(i==3)
v1[i] =k;

}
fclose(f2);

Loading