Sei sulla pagina 1di 12

Esercizi su File

1
Esercizio
• Dato un file di testo chiamato dati.txt già esistente
contenente uno per riga valori che rappresentano numeri
relativi, scrivere un programma in linguaggio C in cui si
dichiarino due struct ST1 e ST2 ciascuna con due campi a e
b di tipo int e che effettua le seguenti operazioni: 
– scrive su video quanti valori contiene il file dati.txt;
– pone nel campo a di ST1 il più grande valore contenuto in
dati.txt;
– pone nel campo b di ST1 il più piccolo valore contenuto in
dati.txt;
– pone nel campo a di ST2 la differenza fra il più grande e il
più piccolo valore contenuto in dati.txt;
– pone nel campo b di ST2 il prodotto fra il più grande e il
più piccolo valore contenuto in dati.txt.

2
#include <stdlib.h>
#include <stdio.h>
typedef struct {int a, b;} ST;
int main() {
ST ST1, ST2; FILE *f; int val;

f = fopen("dati.txt","r");
if (f==NULL) exit(-1);
if (fscanf(f,"%d",&ST1.a) != EOF){
ST1.b = ST1.a;
do {
if( fscanf(f,"%d",&val) != EOF ){
if(val > ST1.a) { ST1.a = val; }
else if (val < ST1.b) { ST1.b = val; }
}
} while(feof(f) == 0 && ferror(f) == 0);
ST2.a = ST1.a - ST1.b; ST2.b = ST1.a * ST1.b;
printf("%d %d\n\t %d %d\n", ST1.a,ST1.b,ST2.a,ST2.b);
}
fclose(f);
return 0;
}
3
Esercizio
• Dato un file di testo chiamato dati.txt già esistente contenente
uno per riga valori che rappresentano numeri relativi, scrivere
un programma in linguaggio C in cui si dichiarino due file F1 e
F2 che esternamente si chiameranno rispettivamente dati1.txt e
dati2.txt e effettua le seguenti operazioni: 
– scrive quanti valori contiene il file dati.txt;
– pone in dati1.txt gli elementi di dati.txt divisibili per 7;
– pone in dati2.txt gli elementi di dati.txt divisibili per 5;
– scrive su video quanti valori contiene il file dati1.txt;
– scrive su video quanti valori contiene il file dati2.txt;

4
#include <stdlib.h>
#include <stdio.h>
int main() {
FILE *f, *f1, *f2;
int val, cont=0, cont7=0, cont5=0;

f = fopen("dati.txt","r");
f1 = fopen("dati1.txt","w");
f2 = fopen("dati2.txt","w");

if (f==NULL || f1==NULL || f2==NULL)


exit(-1);

5
while(fscanf(f,"%d",&val) != EOF) {
cont++;
if(val % 7 == 0) {
cont7++;
fprintf(f1,"%d\n",val);
}
if(val % 5 == 0) {
cont5++;
fprintf(f2,"%d\n",val);
}
}

printf("%d %d %d\n",cont,cont7,cont5);

fclose(f); fclose(f1); fclose(f2);

system("pause");
return 0;
}
6
Esercizio
• Scrivere un programma in linguaggio C che:
– definisce due vettori P e D contenenti ciascuno
100 numeri interi;
– legge da standard input una sequenza di
numeri interi ed inserisce i valori pari nel vettore
P e i valori dispari nel vettore D, l’operazione di
lettura termina quando almeno uno dei due
vettori è stato riempito;
– inserisce in un file di testo denominato dati.txt i
valori contenuti in P e D in modo alternato.

7
#define N 100
int main() {
int P[N], D[N], i=0, j=0, temp, max, k=0;
do {
scanf(“%d”,&temp);
if(temp%2==0) { P[i]=temp; i++; }
else { D[j]=temp; j++; }
} while (i<N && j<N);

if(i>j) { max=i; } else { max=j; }


fp=fopen(“dati.txt”,”w”);
for(k=0;k<max;k++) {
if(k<i) fprintf(fp,”%d\n”, P[k]);
if(k<j) fprintf(fp,”%d\n”, D[k]);
}
fclose(fp);
return 0;
}
8
Esercizio
Scrivere un programma C che:
• ha in ingresso due file denominati rispettivamente A.txt e B.txt
contenenti su ogni riga un numero intero. Il numero di righe dei due file
non è noto a priori ma è uguale nei due file;
• definisce una matrice di nome MATRI 2 X 10 di tipo opportuno e
riempie la prima riga di MATRI con gli elementi di A.txt fino al
riempimento della riga o all'esaurimento dei dati letti dal file; poi riempie
la seconda riga di MATRI con gli elementi di B.txt fino al riempimento
della riga o all'esaurimento dei dati letti dal file;
• copia in un vettore VETT gli elementi presenti nella prima riga della
matrice che soddisfano i seguenti criteri:
– il valore è copiato solo se è maggiore o uguale al valore corrispondente nella
seconda riga della matrice;
– il vettore non deve presentare buchi, ovvero deve essere riempito senza soluzione
di continuità.
• Il programma stampa i valori effettivamente inseriti in VETT.

9
#include <stdio.h>
#include <stdlib.h>

int main() {
FILE *fA, *fB;
int MATRI[2][10], VETT[10], el;
int indR, indV, j;

fA = fopen("A.txt","r");
fB = fopen("B.txt","r");

if(fA == NULL || fB== NULL)


exit(-1);

10
indR=0;
while(fscanf(fA,"%d",&el) != EOF && indR<10) {
MATRI[0][indR] = el;
indR++;
}
for(j=0;j<indR; j++) //fA e fB contengono lo stesso num di el
fscanf(fB,"%d",&MATRI[1][j]);
for(indV=0, j=0; j<indR; j++) {
if(MATRI[0][j] >= MATRI[1][j]) {
VETT[indV] = MATRI[0][j];
indV++;
}
}
for(j=0; j<indV; j++)
printf("%d\n",VETT[j]);
fclose(fA); fclose(fB);
system("pause"); return 0;
}
 
11
Esercizio (tde 6-7-2012)
• Scrivere una funzione che riceve in ingresso un array di numeri naturali pos, una
stringa nomeFile e una stringa messaggio. I valori contenuti nell’array (si faccia
l’ipotesi siano tutti positivi) servono per decifrare un messaggio, tramite il contenuto
del file il cui nome è indicato dalla stringa nomeFile. In particolare, ogni elemento
dell’array indica la posizione nel file del carattere che costituisce il messaggio. Il
sottoprogramma legge il file, decodifica il messaggio e lo inserisce nella stringa
messaggio.
• Il file contiene un numero di caratteri sufficiente per decifrare un qualsiasi messaggio
cifrato.
• Esempio:
• Array in ingresso: [8, 16, 49, 54, 60, 84, 85]
• Output: martedi
• Contenuto del file:
• Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di
monti, tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli, vien,
quasi a un tratto, a ristringersi, e a prender corso e figura di fiume, tra un promontorio
a destra, e un’ampia costiera dall’altra parte; e il ponte, che ivi congiunge le due rive,
par che renda ancor più sensibile all’occhio questa trasformazione, e segni il punto in
cui il lago cessa, e l’Adda rincomincia, per ripigliar poi nome di lago dove le rive,
allontanandosi di nuovo, lascian l’acqua distendersi e rallentarsi in nuovi golfi e in
nuovi seni. 12