MÜSSEN fstreams geschlossen oder gelöscht werden?
-
ungefähr so:
char riff[4]; Wavefile.read(riff, 4); return strcmp(riff, "RIFF") == 0;
-
Polofreak schrieb:
Also ich bin nochmal ein Stück weiter aber kann mir einer von euch sagen wo der Unterschied zwischen denen beiden Zeilen liegt?
FileBin.open(temp, ios::in|ios::out|ios::binary); //geht nicht EDIT: geht schon aber scheint nicht binär zu öffnen! fstream FileBin (temp, ios::in|ios::out|ios::binary); //geht
Bei erster variante mach ich vor der Schleife fstream FileBin;
muss ich da ohne ein File anzugeben schon sagen dass ich binär will?Sagmal programmierst du eigentlich ohne irgendwelche Doku? Bitte geht jetzt gleich auf www.cppreference.com oder ähnliches und ließ dir durch wie Streams funktionieren.
-
und wenn du es wirklich einzelnd abprüfen willst, dann sollte es so gehen. das ist viel lesbarer als die zahlen
if(pRiff[0] == 'R' && pRiff[1] == 'I' && pRiff[2] == 'F' && pRiff[3] == 'F')
jetzt aber genug vom offtopic
-
ach eins noch: einmal benutzt du delete[] und einmal delete. Daher könnte ein Speicherleck oder sonstiges undefiniertes Verhalten auftreten.
-
erst @Offtopic
das geht nicht da stehen 7Zeichen mehr drin als mein RIFF drum krieg ich da immer 0 zurück!@Turing: Vielen Dank für deine Bemühungen. So hab ich es jetzt auch vor, nur leider öffnet er mir mein File mit open anders als wenn ich ihm das gleich als übergabeparameter beim instanzieren mitgeb. beim übergeben beim Instanzieren kann ich Daten vernünftig einlesen wenn ich es mit open versuche steht nur schrott drin. Woran liegt das?
@asdrubael: Danke ich habe mir aber schon durchgelesen wie Fstreams funktionieren, doch bin ich der Meinung das die oben genannten Zeilen das selbe tun, was aber in meinem Fall nicht so ist.
-
stimmt. müsste man noch mit \0 terminieren bevor man strcmp benutzt
-
Polofreak schrieb:
@asdrubael: Danke ich habe mir aber schon durchgelesen wie Fstreams funktionieren, doch bin ich der Meinung das die oben genannten Zeilen das selbe tun, was aber in meinem Fall nicht so ist.
Ja der Meinung kannst du gerne sein es ist aber nicht so.
The function open() is used with file streams. It opens filename and associates it with the current stream. The optional io stream mode flag mode defaults to ios::in for ifstream, ios::out for ofstream, and ios::in|ios::out for fstream.
-
ja genau und zu Fstreams:
The optional filename specifies the file to be opened and associated with the stream.
Das ist doch genau das gleiche. Wo liegt der Unterschied? Könntest du mir das bitte erklären? Ich weiß wirklich nicht wo der Unterschied ist.
Wäre sehr nett.@offtopic wenn ich die \0 terminierung reinmachen will, wo muss ich die machen wie sieht das aus??
-
char riff[5]; // einlesen riff[4] = '\0';
-
@Offtopic: Ja wahnsinn so gehts!
bool CWavealyzeDoc::isRIFF(fstream Wavefile) { char riff[5]; Wavefile.seekg(0,ios::beg); Wavefile.read(riff, 4); riff[4] = '\0'; return strcmp(riff, "RIFF") == 0; }
Ist das jetzt zusätzlich auch noch sauberer oder nur besser lesbar?
-
/Edit: Quatsch der open_mode bei Open ist für solche Geschichten da:
// open and close a file using buffer members #include <fstream> using namespace std; int main () { char ch; fstream filestr; filebuf *pbuf; pbuf=filestr.rdbuf(); pbuf->open ("test.txt", fstream::in | fstream::out); // >> i/o operations here << pbuf->close(); return 0; }
Was auch gehen könnte:
f.open( "foo", ios::open_mode::out|ios::open_mode::binary);
-
Polofreak schrieb:
Ist das jetzt zusätzlich auch noch sauberer oder nur besser lesbar?
Wo ist der Unterschied?
BTW: ich erinner mich, dass die STL-Library ds VC6 ein paar Probleme hat. Kanns sein, dass das anormale Laufzeitverhalten dadurch verursacht wird? Wenn ja: es gibt irgendwo einen Patch dafuer, benutz die Forumsuche!
(hab den Thread hier nur ueberflogen, also sorry wenn das Thema schon vom Tisch ist)
-
Hm also
f.open( "foo", ios::open_mode::out|ios::open_mode::binary);
geht auch nciht müsste es nicht sowieso
f.open( "foo", ios::open_mode::in|ios::open_mode::binary);
heißen? aber es tut eh beides nicht es steht immer nur schrott drin. Wie bekomm ich jetzt nen FStream mit Open binär geöffnet?
-
Wie bekomm ich jetzt nen FStream mit Open binär geöffnet?
Das habe ich bereits geschrieben und so ist es auch richtig! Als Parameter von open gibst Du zum Beispiel
f.open("test.dat", ios::in|ios::out|ios::binary);
an.
Was ist daran bitteschön so schwer. In dem Stream darf auch kein Quatsch stehen, bei Initialisierung eines Streams mit Dateiname wird dieser im Konstruktor u.a. seine open()-Funktion aufrufen. Insofern ist es völlig egal, wann Du open aufrufst!
Am Code liegt es jedenfalls nicht.
Gruss
turing
-
OK das hatte ich auch so siehe hier:
fstream FileBin(NULL,ios::in|ios::out|ios::binary); for(int i = 0; i<AnzahlFiles; i++) { temp = DateiNamen.GetAt(i); if (itsFile.FindFile(temp)) { FileBin.open(temp, ios::in|ios::out|ios::binary); if (FileBin.is_open()) { m_Wavefile = FileBin;
wenn ich das so mache dann steht in meinem Fstream nur Müll! siehe hier (das ist nach dem Read-Befehl)
wenn ich es allerdings in der Schleife beim instanzieren gleich mit übergeb, dann geht es! In dem Stream steht dann aber komischerweise Quatsch, aber wie du schon richtig erkannt hast darf da kein Quatsch drin stehen.
-
Polofreak schrieb:
fstream FileBin(NULL,ios::in|ios::out|ios::binary); for(int i = 0; i<AnzahlFiles; i++) { temp = DateiNamen.GetAt(i); if (itsFile.FindFile(temp)) { FileBin.open(temp, ios::in|ios::out|ios::binary);
Du öffnest ein File ohne Namen und schliest es nicht mehr. => fail => beim nächsten öffnen hast du
ProblemeWürde es so machen
fstream FileBin; for(int i = 0; i<AnzahlFiles; i++) { temp = DateiNamen.GetAt(i); if (itsFile.FindFile(temp)) { FileBin.open(temp, ios::in|ios::out|ios::binary);
Kurt
-
das ist nicht das Problem hatte es schon so wie du schreibst und hab es gerade eben nochmal genau so probiert und es kommt wieder exact das gleiche raus, nur Datenmüll!!
-
Bau für uns ein minimales Beispiel. (das sich compilieren lässt)
-
OK ich denke aber das schaff ich nciht mehr heute, da ich gleich feierabend mach aber jetzt schon mal vielen Dank an euch alle. Morgen bastel ich ein kleines Projekt das dieses Problem aufweist.
Vielen Dank
-
Bitte arbeite in deiner Freizeit weiter.