Newsgroup: it.comp.lang.c++
Titolo: Dov'è l'errore?

Ciao, sebbene la compilazione non mi dia assolutamente alcun problema, al
momento dell'esecuzione ho un errore: le istruzioni incriminate sono
queste...
FILE *temp=(FILE *)malloc(lunghezza_file);
[...]
fread(&swap,sizeof(char),1,sorgente);
fwrite(&swap,sizeof(char),1,temp);
dove lunghezza_file è un intero long, swap un semplice carattere e sorgente
uno stream FILE che rappresenta il file che sto leggendo.
Probabilmente ho fatto il più classico errore da principiante, ma non so
davvero quale sia il problema, quindi come faccio a risolverlo? ;-)
Vi ringrazio anticipatamente, ciao!

FILE *temp=(FILE *)malloc(lunghezza_file);
Che cosa dovrebbe fare secondo te questa istruzione ?
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

Andrea
Creare un file memory-mapped di lunghezza prestabilita?
8-DDDDDDD
Luc.

Mi sa che devi usare tmpfile...
--
Marco Iannaccone     
marc...@tin.it
ICQ: 18748121           Tolkien
"I've... seen things you people wouldn't believe. Attack ships on fire off
the shoulder of Orion.
I watched C-beams... glitter in the dark near the Tanhauser Gate. All
those... moments will be lost... in time..., like... tears... in... rain."
FAQ it.comp.lang.c: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm
FAQ it.comp.lang.c++: 
http://www.programmazione.it/linguaggi/c/lang_faq.htm

 Andrea


FILE *temp=(FILE *)malloc(lunghezza_file);
Non ti serve allocare una struttura FILE in questo modo.
Per questo scopo esiste gia' fopen().
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------

 FILE *temp=(FILE *)malloc(lunghezza_file);
Glob !!!
Seriamente, procurati un testo sul C e comincia a studiare.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 FILE *temp=(FILE *)malloc(lunghezza_file);
Non puoi fare una cosa del genere.
EMG

 wrote in message
39A7972C...@flashnet.it...


da archivio
Hmmm... vediamo se ho capito. Hai un file "grosso" da cui devi
estrarre una parte da salvare in un altro file ?
Un approccio possibile potrebbe essere questo:
int Estrai(const char *archivio, // Nome dell'archivio
           const char *sezione,  // Nome con cui salvare la sezione
           int   posiz,          // Posizione della sezione
           int   lunghezza)      // Dimensione della sezione
{
  FILE *arc;
  FILE *sez;
  arc=fopen(archivio,"rb");
  if (arc==NULL)
  {
    /* Errore in apertura archivio */
    return 0;
  }
  sez=fopen(sezione,"wb");
  if (sez==NULL)
  {
    /* Errore in creazione sezione */
    fclose(arc);
    return 0;
  }
  if (fseek(arc,posiz,SEEK_SET)==0)
  {
    /* Posizionamento riuscito */
    int c;
    while (lunghezza>0)
    { 
      c=getc(arc);
      if (c==EOF)
      {
        /* Errore in lettura */
        break;
      }
      if (putc(c,sez)==EOF)
      {
        /* Errore in scrittura */
        break;
      }
      lunghezza--;
    }
  }
  fclose(arc);
  fclose(sez);
  /* Torna 1 solo se sono stati copiati tutti i byte richiesti */
  return (lunghezza==0);
}
Il loop potebbe essere sicuramente migliorato dal punto di vista
delle prestazioni (non ho voluto complicare l'esempio).
Questa funzione inoltre non usa nulla del C++ che non sia
anche C. Il C++ offre un approccio alternativo a stdio.h/(FILE *)
per la gestione di stream ma visto che usavi FILE * ho pensato
che non volessi utilizzarla per qualche motivo.
Onestamente se pero' secondo te l'istruzione
       FILE *f=(FILE *)malloc(lunghezza_file);
ha qualche significato, oppure se pensi che
       FILE *source=fopen("nome1","rb");
       FILE *dest=fopen("nome2","wb");
       memcpy(dest,source,lunghezza_file);
possa copiare un file in un altro allora ti consiglio caldamente
di riprendere a studiare il C da capo almeno nella sezione
sui file (anche il secondo di questi due esempi compila senza
problemi, ma e' completamente privo di senso; c'e' una bella
differenza fra un programma che compila senza errori e un
programma corretto).
Una versione grossomodo equivalente che invece si basi
sugli stream C++ potrebbe essere la seguente:
  #include <fstream>
  int Estrai(const char *archivio, // Nome dell'archivio
             const char *sezione,  // Nome con cui salvare la sezione
             int  posiz,     // Posizione della sezione
             int  lunghezza) // Dimensione della sezione
  {
    std::ifstream arc(archivio,std::ios::binary);
    std::ofstream sez(sezione,std::ios::binary);
    arc.seekg(posiz);
    char c;
    while(lunghezza>0 && arc.get(c) && sez.put(c))
    {
      lunghezza--;
    }
    return (lunghezza==0);
  }
(spero di aver scritto roba decente,
non conosco bene gli stream C++)


 wrote in message
39a834e5...@news.interbusiness.it...


avvisasse...
E perche' mai avrebbe dovuto farlo ?
FILE e' una struttura come ce ne sono tante altre ed e' del tutto
lecito allocare memoria per un puntatore che punti ad una struttura
del genere.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
-----------------------------------------------
Dovro' prendere lezioni di Internet, 
se non sai di Internet non ti considera nessuno 
(Carmen di Pietro) 
-----------------------------------------------