Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    79

    [C++] Scrittura di bit su file

    Salve,
    sto creando per esercizio un programmino che legge da file un certo numero di interi compresi tra 0 e 31 e scrive su un file binario il numero di elementi del primo file (32 bit) e ciascuno degli interi (5 bit ciascuno).
    il codice è il seguente:

    File contenente il main
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    
    
    #include <vector>
    #include "bit.h"
    
    
    int main(int argc, char **argv){
        
        char *src = argv[1];
        char *dst = argv[2];
        
        FILE *fp_src = fopen(src, "r");
        FILE *fp_dst = fopen(dst, "w");
        
        std::vector<unsigned int> vett;
        
        unsigned int buff;
        
        while(fscanf(fp_src, "%d", &buff) == 1){
            vett.push_back(buff);
        }
        
        printf("size: %d\n", vett.size());
        
        BitWriter bw = BitWriter(fp_dst); 
        
        /* Scrittura del numero di elementi
         */
        bw.write(vett.size(), 32);
        
        /* Scrittura degli elementi con 5 bit
         */
         for(int i = 0; i < vett.size(); ++i){
            bw.write(vett.at(i), 5);
         }
        
        fclose(fp_src);
        fclose(fp_dst);
        
        return EXIT_SUCCESS;
    }

    File contente la libreria per scrivere i bit
    codice:
    struct BitWriter {
    
    
    private:
        FILE *_os;
        unsigned char _buf;
        int _n;
    
    
        void write_bit(unsigned int bit) {
            _buf = (_buf << 1) | (bit & 1);
            ++_n;
            if (_n == 8) {
                printf("scrivo: %x\n", _buf);
                fwrite(&_buf, 1, 1, _os);
                _buf = 0;
                _n   = 0;
            }
        }
    
    
    public:
        BitWriter(FILE *os) {
            _n   = 0;
            _buf = 0;
            _os  = os;
        }
        ~BitWriter() {
            flush();
        }
    
    
        void write(unsigned int val, unsigned int n) {
            while (n-- > 0){
                write_bit(val >> n);    
            }
        }
        void flush() {
            while (_n){
                write_bit(0);    
            }
        }
    };

    L'output del programma è il seguente (ovvero la stampa del buffer contenente il byte da scrivere):

    size: 10
    scrivo: 0
    scrivo: 0
    scrivo: 0
    scrivo: a
    scrivo: a
    scrivo: af
    scrivo: fe
    scrivo: c9
    scrivo: 39
    scrivo: 1a
    scrivo: c0

    che è proprio come dovrebbe essere, dati numeri che sono contenuti nel file che uso come input.
    Il problema è che se apro il file binario tramite un editor esadecimale, manca l'ultimo C0, come se l'ultima fwrite non avesse effetto. Cosa molto strana, dato che stampando sul terminale va tutto bene..

    grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Qual è il file in input?

    Come mai scrivi in binario e non specifichi "wb" nella fopen?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    79
    Ho risolto inserendo "wb" al posto di "w" nella fopen, in effetti mi sono dimenticato di metterlo
    grazie mille!!

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.