[BC++] Vector wegschrijven naar filestream lukt niet

Pagina: 1
Acties:

  • r0nz0r
  • Registratie: Mei 2003
  • Niet online

r0nz0r

I ate it!

Topicstarter
Hallo, voor school moeten wij een programma maken dat wave data kan manipuleren (header uitlezen, echo toevoegen). Nu is dat aardig gelukt maar de manier waarop is niet zo netjes, er kan in ieder geval veel verbeterd worden. Daarom dacht ik laat ik dat programma eens om gaan schrijven naar wat netters met vectoren en filestreams (het kan goed zijn dat ik hier fout denk en dat het helemaal niet makkelijker/netter is, maar dit leek mij wel geschikt). Maar nu kan ik niet eens de wave file kopieeren.

Hier de relevante code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
vector<signed short> data;
vector<signed short>::iterator pos = NULL;
signed short data_temp;

ifstream fWave(openWaveDialog->FileName.c_str(), ios::binary);
ofstream fWaveUit("C:\\test.wav", ios::binary);

if(fWave != NULL)
{
        fWave.read(reinterpret_cast<char*> (&header), sizeof(header));

        while(!fWave.eof())
         {
               fWave.read(reinterpret_cast<char*> (&data_temp), 2);
               data.push_back(data_temp);
         }
         fWave.close();
}

if(fWaveUit != NULL)
{
        fWaveUit.write(reinterpret_cast<char*> (&header), sizeof(header));

        for(pos = data.begin(); pos < data.end(); pos++)
        {
               fWaveUit.write(reinterpret_cast<char*> (data.at(*pos)), 2);
        }
        fWaveUit.close();
}


Als ik dit draai en een wave-file open krijg ik een out of range exception, eerlijk gezegd zou ik zo snel niet weten hoe dit komt. Want hij zou niet verder mogen gaan dan het eind van de vector data. Het lijkt mij dat hij dit wel doet en dat ik daarom die exception krijg?

Kan iemand hier een lichtje over laten schijnen?

Hymns of indigestible suppuration


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
a) ga er eens stap voor stap met een debugger doorheen, dan weet je waar in je code de fout zit
b) pos is een iterator, en geen positie indicator. Het resultaat van *pos is dan ook een signed short uit je wav file. Dat data.at(*pos) dan een out-of-range exception kan geven is dan niet zo verwonderlijk...

  • r0nz0r
  • Registratie: Mei 2003
  • Niet online

r0nz0r

I ate it!

Topicstarter
a) de fout komt in die for loop, fWaveUit.write(reinterpret_cast<char*> (data.at(*pos)), 2); bij die regel natuurlijk. Tenminste ik denk bij die regel en niet door de for loop zelf.

b) dus *pos (de iterator) bevat de data die ik probeer weg te schrijven als ik het goed begrijp? Ik heb nog maar een heel klein beetje kennis van vectoren en dacht die kennis zo wat te vergroten dus vandaar dat het niet zo goed klopt.

Hymns of indigestible suppuration


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Let op: NULL is geen in het algemeen valide waarde voor een iterator. Als het werkt is het toeval, en een implementatie detail van Borland. Zeker in debug mode is het gebruikelijk om NULL af te wijzen.

Ik vermoed dat je eerst in C hebt geprogd. Waarom declareer je je variabelen voordat je ze gebruikt? Als je pos pas declareert wanneer je 'm voor het eerst gebruikt, dan heb je meteen de beginwaarde.

Verder test je je fstream op de verkeerde manier. Je kunt streams niet voorspellend testen (en al helemaal niet met != NULL, maar ook niet met .eof( ) ), je kunt alleen testen of een read lukte. Dat doe je dan met if (fWave) { ... }; fWave.eof( ) gebruik je alleen om te kijken waarom de read mislukte. (andere mogelijkheid is fWave.fail( ) )

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • r0nz0r
  • Registratie: Mei 2003
  • Niet online

r0nz0r

I ate it!

Topicstarter
Ja, het klopt dat dit vertaald is vanuit C. Ook heb ik nog niet echt concreet les gehad in filestreams en vectoren, dus vandaar de klok en klepel taferelen. Ik ga eens kijken wat eruitkomt als ik die foutjes verbeter.

Hymns of indigestible suppuration