Newsgroup: it.comp.lang.c
Titolo: Problema con la lettura da file .txt contenente invii

Ciao a tutti!
Ho un problema che non riesco proprio a risolvere!
Ho provato a girare il programmino che sto facendo in diversi modi, però non
riesco a togliere questo problema. Spero possiate aiutarmi.
Ecco il problema:
Ho due file: due uno leggo e sull'altro scrivo.
Quando vado a leggere sul file, tutto a posto, finché non arrivo ad un punto
in cui è presente un invio '\n' o '10' in ASCII.
A questo punto è come se quella posizione valesse due posizioni, perché se
leggo in sequenza, e deposito il carattere letto in una variabile int
chiamata appunto 'carattere', vedo che il valore '10', quindi invio, appare
per due volte consecutive, sfalsandomi tutto il ghirigori che avevo
amorevolmente creato!
Infatti non riesco ad avere una simmetria fra i due file, quello che leggo
alla fine risulta sempre diverso da quello su cui vado a scrivere!
Non so se ho spiegato bene il problema.
Metto un pezzetto di codice della funzione che dovrebbe mischiare le lettere
del file originale mettendole in uno di destinazione:
void sviluppo()
{
     FILE* file_algoritmo, *file_originale;
     int i, carattere, numero_caratteri, settore=0;
     int resto, cicli;
     numero_caratteri=numero_caratteri_file;  // Questa è un var dichiarata
globalmente
    leggi_infofile();  // Funzione che legge nome file e percorso
    cicli=numero_caratteri/10;
    resto=numero_caratteri%10;
    remove("alg1");
    file_algoritmo=fopen("alg1","a");
    file_originale=fopen(info_file,"r");  // File originale da aprire per
lettura
    for(i=1;i<=cicli;i++) {
        fseek(file_originale,9+settore,0);  // 1 - 9
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,1+settore,0);  // 2 - 1
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,6+settore,0);  // 3 - 6
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,0+settore,0);  // 4 - 0
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,3+settore,0);  // 5 - 3
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,8+settore,0);  // 6 - 8
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,4+settore,0);  // 7 - 4
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,7+settore,0);  // 8 - 7
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,2+settore,0);  // 9 - 2
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
        fseek(file_originale,5+settore,0);  // 10 - 5
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
    settore=settore+10;
 }
    for(i=1;i<=resto;i++) {
        fseek(file_originale,numero_caratteri-(resto-(i-1)),0);
        carattere=fgetc(file_originale);
        fputc(carattere,file_algoritmo);
    }
    fclose(file_algoritmo);
    fclose(file_originale);
    return;
}
Ciao ciao :)
estr...@libero.it
estr...@tiscalinet.it
http://web.tiscalinet.it/tempo_libero/index.html

un punto in cui è presente un invio '\n' o '10' in ASCII.
Prova ad aprire/creare il nuovo file in modalita' binaria.
Inoltre, se vuoi che il tuo programma diventi piu' veloce dovresti :
- leggere 10 caratteri e memorizzarli in un stringa
- creare la nuova stringa mischiando i caratteri presi dalla vecchia
- scrivere la nuova stringa
In questo modo eviti le fseek e le operazioni di i/o diventano un
decimo.
ciao

 - scrivere la nuova stringa
OK. Grazie a tutti per i suggerimenti e per la dritta di usare i file in
modalità binaria.
Soltanto una cosa: devo sapere qualcosa sull'uso dei file binari? Ci sono
differenze importanti oltre a quella della traduzione dei caratteri di
new-line? Ho notato dei simboli strani quadriti, come li gestisco?
Scusate se vi riempio di domande, ma i file binari non li ho proprio capiti.
Ciao ciao :-)
estr...@libero.it
estr...@tiscalinet.it
http://web.tiscalinet.it/tempo_libero/index.html

 A questo punto è come se quella posizione valesse due posizioni,
In effetti, sotto alcuni sistemi come MS-DOS e Windows, il carattere
'\n' rappresenta in realtà due caratteri nel file, normalmente CR (13) e
LF (10). Per risolvere questi problemi esistono le due modalità di
apertura file testo e binaria.
EMG


Non c'è nessuna differenza salvo la non traduzione di CR/LF.
Se tratti dati binari, cioè che assumono valori da 0 a 255, normalmente è perchè
non ti interessa trattarli come caratteri ASCII, cioè le sequenze di byte non
devono rappresentare delle stringhe di testo o comunque avere un significato
logico in linguaggio "umano". Quindi è assai probabile imbattersi in valori non
rappresentabili con caratteri ascii, che solitamente i debugger sostituiscono
con un carattere di riempimento ( punto, spazio, quadrato pieno ). Chiaramente
se li guardi come stringhe di caratteri possono non significare nulla.
Tipicamente sotto piattaforma DOS / Win  i file vanno aperti in modalità binaria
se devono contenere dei dati usati da dei programmi. In modalità testo se si
vuole generare un file di testo, da aprire con un qualunque editor di testo.
Nessuno ti vieta di aprire in input un file in modalità binaria e uno in output
in modalità di testo e prendere i dati da un file e scriverli nell'altro. Questo
trucco è utile ad esempio se hai un file ascii proveniente da UNIX/Linux e il
tuo editor di testo te lo mostra come una sola lunghissima linea.
Ciao
Ricky