MÜSSEN fstreams geschlossen oder gelöscht werden?
-
OK fürs rausschreiben meiner Daten kann ich dir so ja noch recht geben, aber zum lesen leider nicht ich brauch die Werte von allen 13000 Files also muss ich auch alle 13000 öffnen oder etwa nicht??
-
guck doch im task manager nach wieviel handles geöffnet sind.
am besten process explorer von sysinternals.com
-
Also ich hab mir das mal angeschaut und Filehandles hab ich nur eines immer offen, aber wieso kann ich nicht closen?
Jetzt noch ein neues Phänomen, wenn ich fstream Filbin... mach dann öffnet er mir das file schön mach ich aber vor der schleife fstream filebin; und dann in der Schleife
Filebin.Open und ich frag danach ab if (Filebin.IsOpen()) dann komm ich hier in den else Fall! Sprich er öffnet mir das File auch nicht! Woran liegt das?
Wieso kann ich weder öffnen noch schließen?
-
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? denn wenn ich das hier mache:char* pRiff = new char[4]; Wavefile.seekg(0,ios::beg); Wavefile.read(pRiff,4); if(pRiff[0] == 82 && pRiff[1] == 73 && pRiff[2] == 70 && pRiff[3] == 70)
geht er mit erster variante in den else und im debug steht nur Datenmüll und bei zweitter Variante geht er mir darein!
-
oh, man dein code ist scheußlich. warum legst du ein 4 byte array auf dem heap an und warum vergleichst du jeden buchstaben einzeln und dann auch noch mit den zahlenwerten? man kann auch 'R' 'I' 'F' 'F' schreiben oder strcmp verwenden.
-
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?