MÜSSEN fstreams geschlossen oder gelöscht werden?
-
OFFTOPIC
Ja wie jetzt so?
bool CWavealyzeDoc::isRIFF(fstream Wavefile) { char* pRiff = new char[4]; //ich will ja nur entsprechende 4 Byte vergleichen also hol ich mir auch nur die Wavefile.seekg(0,ios::beg); Wavefile.read(pRiff,4); if(pRiff =='R' 'I' 'F' 'F') // <= SO???? { delete [] pRiff; return true; } else { delete pRiff; return false; } }
-
Du rufst jedesmal Konstruktor/Destruktor zwischen {...} auf. Das erklärt, warum Du nur ein Filehandle hast und das ist auch richtig.
Hiermit darf es keine Probleme geben und du hast auch nur einmal einen Konstruktor / Destruktor aufgerufen.
fstream file; for (...) { // deine Bedingungen file.open(...); if (!file) // fehler // mach was damit file.clear(); file.close(); }
Nach obigem Beispiel hab ich mir jetzt ein kleines Programm zusammen geschnipselt und mehrmals 100.000x eine Datei öffnen, clearen und schliessen lassen. Das ganze hat konstant immer ca. 2800 ms gedauert. Ich will jetzt einfach mal so vermessen sein zu behaupten, dass dies schnell und auch richtig ist.
Ich würde ausserdem die 13000 MsgBoxen weglassen
Gruss
turing
-
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)