Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - file binari
Forum - C/C++ - file binari

Avatar
genni_96 (Normal User)
Pro


Messaggi: 108
Iscritto: 04/06/2010

Segnala al moderatore
Postato alle 8:21
Venerdì, 08/10/2010

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4.  
  5. int main()
  6. {
  7.     fstream f;
  8.     char *text;
  9.     unsigned int length;
  10.  
  11.     f.open("a.mp3", ios::binary!ios::in);
  12.  
  13.     f.seekg (0, ios::end);
  14.     length = f.tellg();
  15.     f.seekg (0, ios::beg);
  16.    
  17.     text = new char[length+1];
  18.     f.read(text,length);
  19.     f.close();
  20.    
  21.     cout<<text;
  22.     delete[]text;
  23.     system("pause");
  24. }



il problema è che mi legge solo file di testo (come txt, cpp, h, anche il makefile) ma se provo ad aprire (come nel codice sopra) un mp3 on un qualunque alto file (come bmp,wma,jpeg ecc.) mi legge solo i primi 3 o 4 caratteri;
come posso fare a leggere tutto il file;
una volta letto tutto dovrei codificare la stinga letta e riscrivere il file con un'altra estensione, ma questo lo so fare, il probleme è leggere;

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 13:28
Venerdì, 08/10/2010
allora, i file binari, a differenza dei file di testo, possono contenere qualsiasi tipo di byte al loro interno, anche il byte '\0', ovvero il terminatore delle stringhe.
la read legge corretamente il contenuto ma poi quando vai a mostrarlo la printf si interrompe ad ogni '\0' :) facendo sembrare che il file sia "troncato"

quello che devi fare se vuoi mostrare a video un file binario (per quanto questo possa essere utile), è ciclare stampando "a mano" i char del buffer fino ad incontrare il numero di caratteri letti, ottenuti con la funzione gcount().

cmq consiglio una lettura della reference: http://www.cplusplus.com/reference/iostream/istream/read/

EDIT:

riguardando l'esempio della reference, usa un metodo più furbo per fare quello che chiedi, ovvero chiamare cout.write direttamente sul buffer :)

Ultima modifica effettuata da HeDo il 08/10/2010 alle 13:30
PM
Avatar
genni_96 (Normal User)
Pro


Messaggi: 108
Iscritto: 04/06/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 14:51
Venerdì, 08/10/2010
non ci avevo pensato,
però mi rimane ancora un dubbio,
se scrivo la variabile text con write() dovrebbe comunque scrivere indipendentemente dal '\0', o mi sbaglio??

PM
Avatar
genni_96 (Normal User)
Pro


Messaggi: 108
Iscritto: 04/06/2010

Up
-1
Down
V
Segnala al moderatore
Postato alle 15:01
Venerdì, 08/10/2010
Grazie HeDo
ho risolto il problema:k:
scrivevo con write(text,strlen(text));
ho capito che strlen ritorna il numero di caratteri fino allo '\0'

PM