21/09/10 17:01
GuglielmoS
Salve a tutti!
A scuola ci hanno chiesto di risolvere un esercizio teoricamente banale che consiste nel trasformare le vocali presenti in un file in maiuscole (tutto questo nello stesso file).
Il problema si presenta però al momento della sovrascrittura delle vocali, infatti sembra che il file pointer si "sballi" e il programma entri in un ciclo infinito. Per far funzionare il tutto bisogna aggiungere questa riga dopo la fwrite del carattere modificato:
Ora teoricamente questa linea di codice non dovrebbe fare niente, e quindi mi chiedo perchè la devo inserire?
Ecco il resto del codice:
Grazie,
Saluti GuglielmoS
A scuola ci hanno chiesto di risolvere un esercizio teoricamente banale che consiste nel trasformare le vocali presenti in un file in maiuscole (tutto questo nello stesso file).
Il problema si presenta però al momento della sovrascrittura delle vocali, infatti sembra che il file pointer si "sballi" e il programma entri in un ciclo infinito. Per far funzionare il tutto bisogna aggiungere questa riga dopo la fwrite del carattere modificato:
fseek(fp, 0, SEEK_CUR);
Ora teoricamente questa linea di codice non dovrebbe fare niente, e quindi mi chiedo perchè la devo inserire?
Ecco il resto del codice:
#include <stdio.h> #include <ctype.h> void trasformaVocaliInMaiuscole(FILE *fp); int vocale(char ch); int main (int argc, char *argv[]) { FILE *fp; if (!(fp = fopen("dati.txt", "r+"))) { perror("Errore apertura file"); return 1; } trasformaVocaliInMaiuscole(fp); fclose(fp); return 0; } void trasformaVocaliInMaiuscole(FILE *fp) { char ch; while (!feof(fp)) { /* leggo il carattere corrente, e verifico che non ci siano errori durante la lettura */ if (fread(&ch, 1, 1, fp) == 0) { break; } /* nel caso in cui il carattere letto sia presente nell'alfabeto, lo converto e lo sovrascrivo nel file */ ch = toupper(ch); if (vocale(ch)) { fseek(fp, -1, SEEK_CUR); fwrite(&ch, 1, 1, fp); fseek(fp, 0, SEEK_CUR); } } } /** * Restituisce 1 se 'ch' è una vocale, 0 altrimenti. */ int vocale(char ch) { ch = toupper(ch); switch (ch) { case 'A': case 'E': case 'I': case 'O': case 'U': return 1; default: return 0; } }
Grazie,
Saluti GuglielmoS
aaa