Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    <C++/Linux> Lettura porzione file wav da buffer

    Ciao a tutti.

    Sto cercando (inutilmente) di leggere una parte di un file wav caricato in memoria.

    Per creare il buffer uso questo metodo :

    ifstream file ("tekBassdrum.1.144.wav", ios::in|ios::binary);
    if (file.is_open())
    {
    /*Altro codice*/
    }

    Dopo , per rileggerlo da un punto preciso uso:

    size = file.tellg();
    memblock = new char [size];
    file.seekg (0, ios::end); // <- Lo zero è un valore dimostrativo
    file.read (memblock, size);

    Il problema e che con questo metodo posso leggere si una porzione ma solo da un punto preciso fino alla fine
    (ios::end);

    Come posso fare per leggerlo da un numero di byte ad un altro?

    TIPO:

    leggi(da byte, a byte)

    In più vorrei poter ripetere questa operazione ,per poter leggere parti differenti del file

    Grazie in anticipo.

  2. #2
    cosa intendi con
    posso leggere si una porzione ma solo da un punto preciso fino alla fine
    Con:
    codice:
    file.seekg (0, ios::end);
    ti posizioni alla fine del file, ma se invece di 0 usi ad esempio
    -3, ti posizioni 3 byte prima della fine del file.
    Puoi usare anche ios::beg, per pertire dall'inizio del file
    o ios::cur per partire dalla posizione corrente.

    Poi con:
    codice:
    file.read (memblock, size);
    leggi size byte (e non fino alla fine del file), dal punto in cui ti sei portato
    e li memorizzi in memblock

    qual'è il problema?

  3. #3
    Dimenticavo:

    codice:
    size = file.tellg();
    in questo modo size contiene la posizione corrente nel file.
    Quindi se sei all'inizio del file vale zero se sei alla fine è pari
    alla lunghezza del file (o un valore intermadio se ti trovi in
    altra posizione).

    Quindi con

    codice:
    memblock = new char [size];
    richiedi una memoria pari alla posizione in cui ti trovi
    sul file (es: se sei sul secondo byte del file richiedi due byte).
    E' proprio questo che volevi fare?

  4. #4
    no , in effetti non era quello che volevo fare .

    il mio scopo è quello di caricare il file (tutto il file) in un buffer e leggerne parti a piacere.

    cmq grazie per la risposta, molto esauriente.

    provo un po' a vedere cosa succede poi faccio sapere.


    ciao e grazie ancora

  5. #5
    Se ho capito, ti serve un buffer in memoria, grande quanto il tuo file.

    Allora la tua idea è giusta, ma devi semplicemente portare prima dell'
    istruzion tellg(), l'istruzione seekg (0, ios::end).
    Cioè devi prima posizionarti alla fine del file, così quando richiedi la
    posizione ottieni la lunghezza del file.

    Devi cambiare da:
    codice:
    size = file.tellg();
    memblock = new char [size];
    file.seekg (0, ios::end); // <- Lo zero è un valore dimostrativo 
    file.read (memblock, size);
    a:
    codice:
    file.seekg (0, ios::end); // <- Lo zero va bene così
    size = file.tellg();
    memblock = new char [size];
    file.read (memblock, size);
    Se invece con
    caricare il file (tutto il file) in un buffer e leggerne parti a piacere.
    intendi leggere parti a piacere da uno stream, come mi sembra
    di capire da

    Per creare il buffer uso questo metodo :
    ifstream file ("tekBassdrum.1.144.wav", ios::in|ios::binary);
    devi semplicemente giostrare il tutto con seekg(spostamento,da_posizione)

  6. #6
    Scusa ma se io faccio:
    codice:
    file.seekg (0, ios::end); // <- Lo zero va bene così
    size = file.tellg();
    memblock = new char [size];
    file.read (memblock, size);
    Leggo size byte dalla fine del file, ma alla fine del file non c'è più niente da leggere.
    Quindi io cambierei in:
    codice:
    file.seekg (0, ios::end); // <- Lo zero va bene così
    size = file.tellg();
    memblock = new char [size];
    file.seekg (0, ios::beg);
    file.read (memblock, size);

  7. #7
    Si certo!

  8. #8
    grazie mille a tutti , credo di avere capito il meccanismo.

    guardo cosa ne esce e poi posto il codice x conferma.

  9. #9
    un altra cosa,

    all'inizio di un file wav (come in tutti i file credo) divrebbe esserci un header che specifica la tipologia di file.

    da quale byte iniziano i dati?

    oppure esiste un sistema x identificare l'header rispetto ai dati veri e propri?

    xche nel caso io facessi una lettura da ios::beg ricaverei l'intestazione e una parte di dati , giusto?

    ma quando vado a precessare il tutto l'header mi darebbe solo fastidio, in quanto non rientra nei dati.

  10. #10

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 © 2024 vBulletin Solutions, Inc. All rights reserved.