Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Stream binario di un vettore con fwrite e fread.

    Salve, ho alcuni dubbi riguardanti la scrittura/lettura di un file binario in C++.

    Faccio riferimento al libro di testo Herbert Schildt, "C++ The Complete Reference, 4th Edition", dove le funzioni fwrite e fread sono così definite:

    size_t fread(void *buffer, size_t num_bytes, size_t count, FILE *fp);

    size_t fwrite(const void *buffer, size_t num_bytes, size_t count, FILE *fp);

    I miei dubbi sono i seguenti:

    1) Perché in fwrite il puntatore *buffer è di tipo const void e non semplicemente void?

    2) Supponiamo che io voglia scrivere su un file binario un vettore intero:
    (uso Dev-C++ 4.9.9.2, non so se sia utile specificarlo)

    codice:
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    using namespace std;
    
    int main()
    {
    int V[] = {1,2,3,4,5};
    
    FILE *fp;
    
    fp = fopen("myfile.bin", "wb");
    if(fp == NULL)  
    {
     cout<<"\nImpossibile aprire il file \n";
     return 1;
    }
    
    fwrite(V, sizeof V, 1, fp);
    fclose (fp);
    
    
    return 0;
    }
    L'espressione fwrite(V, sizeof V, 1, fp); dice che sto scrivendo, su myfile.bin, 1 blocco di dati da sizeof V bytes, cioè, un blocco da 20 bytes.

    Intuitivamente, io sarei portato a credere che trasferire un vettore int V[5] voglia dire trasferire 5 blocchi di dati da 4 bytes ciascuno, ma in tutti gli esempi che sono riuscito a trovare, il terzo argomento di fwrite/fread è sempre 1.

    E' errata la mia interpretazione? Cosa determina il numero di blocchi da trasferire? Qual è il massimo numero di bytes da poter trasferire "con un solo blocco"?
    Il mio dubbio vale sia per fwrite che per fread.


    Grazie anticipatamente.

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    Re: [C++] Stream binario di un vettore con fwrite e fread.

    Il motivo del const void* è che si vogliono accettare anche puntatori a costante.
    Qualsiasi puntatore è compatibile con un puntatore a void, ma ad esempio "ciao" non viene accettato come puntatore a void.
    "ciao" è in fatti un puntatore a costante (la stringa si trova in memoria di sola lettura).
    Se l' argomento non fosse const void*, non saresti in grado di passare "ciao" come argomento.O comunque puntatori a un' area di memoria di sola lettura.
    Per quanto riguarda gli argomenti della fread e fwrite,essendo V un vettore, sizeof(V) è la dimensione di tale vettore (che è nello stack), mentre il terzo argomento è il numero di elementi da scrivere.

  3. #3

    Re: Re: [C++] Stream binario di un vettore con fwrite e fread.

    Originariamente inviato da ramy89
    Il motivo del const void* è che si vogliono accettare anche puntatori a costante.
    Qualsiasi puntatore è compatibile con un puntatore a void, ma ad esempio "ciao" non viene accettato come puntatore a void.
    "ciao" è in fatti un puntatore a costante (la stringa si trova in memoria di sola lettura).
    Se l' argomento non fosse const void*, non saresti in grado di passare "ciao" come argomento.O comunque puntatori a un' area di memoria di sola lettura.
    Per quanto riguarda gli argomenti della fread e fwrite,essendo V un vettore, sizeof(V) è la dimensione di tale vettore (che è nello stack), mentre il terzo argomento è il numero di elementi da scrivere.
    Il numero di elementi del vettore o il numero di vettori da trasferire?

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Il numero di elementi del vettore (ciascuno di dimensione size) che vuoi scrivere.
    Trovi tutto su c++ reference:
    http://www.cplusplus.com/reference/c...cstdio/fwrite/

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C++] Stream binario di un vettore con fwrite e fread.

    Originariamente inviato da zummingsky
    Intuitivamente, io sarei portato a credere che trasferire un vettore int V[5] voglia dire trasferire 5 blocchi di dati da 4 bytes ciascuno, ma in tutti gli esempi che sono riuscito a trovare, il terzo argomento di fwrite/fread è sempre 1.
    Potresti tranquillamente scrivere che stai trattando 5 interi con

    sizeof(int), 5

    massimo numero di bytes da poter trasferire "con un solo blocco"?
    I parametri sono ambedue di tipo size_t ... fai due conti ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    perfetto, grazie a tutti!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.