Du hast zwar einige Kritikpunkte behoben, aber die wesentlichen Bemängelungen sind immer noch drin, zum Beispiel:
WAVEHEADER *readWaveHeader(ifstream *fin)
Es besteht kein Grund, hier Zeiger zu benutzen, weder für den Rückgabewert noch für den Parameter. Gib´ ein Objekt als Value zurück und übergib´ den Inputstream als Referenz:
WAVEHEADER readWaveHeader( ifstream& ifs )
{
WAVEHEADER wh;
// Daten lesen
// Objekt zurückgeben
return wh;
}
Wenn du das Ganze noch C++ konform lösen willst solltest du den operator>> und oeprator<< für WAVEHEADER und istream/ostream überladen:
istream& operator>>( istream& is, const WAVEHEADER& wh )
{
// Daten aus stream lesen
}
ostream& opertaor<<( ostream& os, WAVEHEADER& wh )
{
// Daten in stream schreiben
}
Außerdem hat cooky451 schon erwähnt, dass die Elemente einer Struktur/Klasse nicht lückenlos linear hintereinander im Speicher liegen müssen. Der Compiler kann zwischen einzelnen Elementen Füllbytes (Padding) einfügen, um schneller auf die Elemente zugreifen zu können. Daher solltest du dem Compiler noch explizit sagen, dass er für die Struktur kein Padding verwenden darf. Wie das geht hängt vom Compiler ab. Beim Codegear 2007 könnte das so aussehen:
#pragma pack( push, 1 ) // Elemente auf Bytegrenzen ausrichten
struct WAVEHEADER
{
...
};
#pragma pack( pop ) // alte Ausrichtung wiederherstellen
PS:
Die Ausrichtung für die Struktur muss natürlich nur dann auf Bytegrenzen gesetztz werden, wenn du sie am Stück mit write schreiben oder mit read willst. Alternativ kannst du auch alle Elemente separat in den Stream schreiben (bzw. aus ihm lesen), dann ist die Elementausrichtung der Struktur egal.
PPS:
Es gibt den Datentyp std::string , dann brauchst du keine char-Arrays mehr durch die Gegend zu reichen.