Newsgroup: it.comp.lang.c
Titolo: File binario

Ciao a tutti
La seguente funzione prende il contenuto di due file e crea un terzo 
file con il contenuto dei due.
void merge(FILE *file_uno, FILE *file_due, FILE *file_bin)
{
      file_uno = fopen("testo.txt", "r");
      file_due = fopen("testo1.txt", "r");
      file_bin = fopen("testo3.bin", "wb");
      char ch;
      for(ch = getc(file_uno); ch != EOF; ch = getc(file_uno)){
          fputc(ch, file_bin);
          }
      for(ch = getc(file_due); ch != EOF; ch = getc(file_due)){
          fputc(ch, file_bin);
      }
          fclose(file_uno);
          fclose(file_due);
          fclose(file_bin);
}
Ora il mio problema e' il 3 file creato deve essere un file binario,
qndi come faccio a crearlo ?
Ho provato ad inserire
fwrite(&ch, sizeof(int), 1, file_bin);
all'interno dei due for ma credo sia sbaglaito.
Grazie in anticipo

Claudio ha scritto:

In sistemi POSIX-compliant non ci dovrebbe essere differenza fra un file 
binario ed uno ASCII; ergo in tale caso potresti omettere il flag "b" 
nella terza open. Lasciando tale flag ti dovresti garantire anche la 
compatibilità sui sistemi che differenziano i file ASCII da quelli binari.
Il codice mi pare vada bene, ma perchè leggi e scrivi 1 byte alla volta?
Ciao, Alberto

> Il codice mi pare vada bene, ma perchè leggi e scrivi 1 byte alla volta?
no il codice e' cannato gravemente.
Tanto per dirne una usa un char ch per immagazzinare il valore
restituito da getc, ma getc restituisce un int, non un char,
e infatti il valore di controllo EOF e' un int e non un char.
come minimo deve andare a rileggersi le specifiche di getc.
questa poi:
fwrite(&ch, sizeof(int), 1, file_bin);
non ha senso. Se ch e' un char, perche' sizeof(int) ??
Basta che ti leggi il manuale relativamente a fwrite.
ora e' tardi e non ho la forza di riguardare tutto il codice.
ciao,
g.

ciao Alberto
Alberto EMME ha scritto:

 >> Sono d'accordo con te,  ma a me serve creare un file binario.
 >> ciaoo e non ho capito come fare.
 >> ciao claudio


 qndi come faccio a crearlo ?
Non esistono file di testo o file binari.
Un file e` una sequenza di byte, Quello che puo` fare differenza e` come 
le funzioni di libreria trattano quei byte.
      file_bin = fopen("testo3.bin", "wb");
Il file "testo3.bin" usando in apertura l'opzione "wb" viene trattato 
come file binario.
In ambiente UNIX non esistono differenze di trattamento fra file binari 
e file di testo, per cui i file possono essere aperti indifferentemente 
in modo testo od in modo binario.  Nel buffer di lettura del programma 
ci saranno sempre esattamente quello che e` contenuto nel file.
In ambiente MS-DOS/Windows ci sono due differenze fondamentali:
- il fine linea e` definito come '\r\n'  (CR-LF)
- il fine file e` definito dal carattere ^Z (Ctrl-Z)
Se il file viene aperto in modalita` testo le funzioni della libreria 
traducono automaticamente '\r\n' -> '\n' e '^Z' -> EOF.  Nel buffer di 
lettura del programma ci sara` quindi un contenuto diverso dal file su 
disco.
Se lo stesso file viene aperto in modalita` binaria quei caratteri sono 
passati nel buffer di lettura senza alcuna manipolazione.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 traducono automaticamente '\r\n' -> '\n' e '^Z' -> EOF.
Non è esatto. ^Z è solo una sequenza che permette di simulare la
condizione di EOF per gli stream attaccati ad un terminale (tipicamente
lo stdin), e funziona anche per i file binari. Tale carattere non è
inoltre memorizzato nel file.
Luca
-- 
Colui che sorride quando le cose vanno male ha pensato a qualcuno a cui
dare la colpa.

 carattere non è inoltre memorizzato nel file.
Aveva parzialmente ragione Giovanni. Non è vero che l'EOF sia per forza un 
carattere esistente, ma se in un file aperto con "t" è presente il carattere 
0x1A (EOF - Ctrl-Z), questo viene tradotto nella condizione di EOF. Questo 
non succede se il file è aperto con "b". Test eseguito con Visual Studio 6.0 
sotto Windows XP:
#include <stdio.h>
int main (void)
{
    FILE *pf;
    int i;
    pf = fopen ("test.txt","rt");
    i = fgetc (pf);
    while (!feof(pf)) {
        putchar (i);
        i = fgetc (pf);
    }
    fclose (pf);
}
Il file test.txt contiene "Prova1",0x1A,"Prova2". L'ho allegato, ma non so 
se si può nei newsgroup! Viene stampato solo "Prova1".
-- 
Costantino Grana 


Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 se si può nei newsgroup! Viene stampato solo "Prova1".
non ho provato il programma ma confermo.


 
Si io mi riferivo ai sistemi MS-DOS/Windows.  Le funzioni di libreria 
dei compilatori se leggono ^Z da un file in modalita` testo ritornano EOF.
Inoltre i vecchi editor per MS-DOS (tipo edlin :-) scrivevano 
fisicamente un ^Z alla fine del file.  Ed lo facevano anche SPF (editor 
dell'IBM derivato dal T.S.O.) e l'editor della DIGITAL (portato dal VAX).


 viene aperto in modalita' testo.
Sapevo che era usato dal DOS, ma non pensavo fosse stato mantenuto anche
sotto win32.
Luca
-- 
#include <stdio.h> 
int main(void) {printf("\t\t\b\b\b\b\b\b");
printf("\t\t\b\b\b\b\b\b");return 0;}