fstream
-
Hallo zusammen,
ich habe eine vorgegebene Methode:
void CKrypto::file_code(const char *file_in, const char *file_out, int dir) { if(dir != 1 && dir !=-1) throw invalid_argument(errTxt[5]); fstream istr(file_in, ios_base::in | ios_base::binary); if(!istr.is_open( )) throw domain_error(errTxt[3]);//hier bekomme ich den Fehler fstream ostr(file_out, ios_base::out | ios_base::binary); if(!ostr.is_open( )) throw domain_error(errTxt[4]); int nread; char * readbuf= new char[_block_length]; do { istr.read(readbuf, _block_length); nread= istr.gcount(); if(nread>0) { switch(dir) { case 1: encode(readbuf, nread); break; case -1: decode(readbuf, nread); break; } ostr.write(readbuf, nread); if(ostr.fail()) throw domain_error(errTxt[2]); } } while(!istr.eof( )); delete [ ] readbuf;Fehler beim Öffnen der Datei.
So lese ich die Daten ein.char *file_in, *file_out, *key, c_key; file_in = new char; *file_in = NULL; file_out = new char; *file_out = NULL; cin.get(file_in, 30); cin.ignore(); cin.get(file_out, 30); cin.ignore(); Vigenere.file_code(file_in, file_out, 1);Könnt ihr mir vielleicht sagen, warum ich diesen Fehler bekomme?
Vielen Dank schon mal, ihr seid super.
Seaman
-
Hmm ich sehe nirgends das du das File je geöffnet hast!?
Alleine der Konstruktoraufruf von fstream bewirkt nicht gleichzeitig das öffnen des Files.
Wenn du uns sagst was du machen willst, können wir dir vielleicht eine bessere Methode vorschlagen um das ganze zu lösen.
-
Firefighter schrieb:
Alleine der Konstruktoraufruf von fstream bewirkt nicht gleichzeitig das öffnen des Files.
Doch, sollte aber so sein, oder verstehe ich etwas falsch?
fstream ( );
explicit fstream ( const char * filename,
ios_base::openmode mode = ios_base::in | ios_base::out );(...)
Additionally, when the second constructor version is used, the stream is associated with a physical file as if a call to the member function open with the same parameters was made.
Quelle: http://www.cplusplus.com/reference/iostream/fstream/fstream/
-
Firefighter schrieb:
Alleine der Konstruktoraufruf von fstream bewirkt nicht gleichzeitig das öffnen des Files.
Doch. Die in diesem Fall aufgerufene überladene Konstruktorversion öffnet das File gleich - wenn es denn existiert.
-
Höö?Ok ich hatte es immer explizit gemacht.Gut dann öffnet er es gleich.Mein Fehler.
-
char *file_in, *file_out, *key, c_key; file_in = new char; //hier passt nur !ein! Zeichen rein. Soll das so sein? *file_in = NULL; file_out = new char; //Hier auch. *file_out = NULL; cin.get(file_in, 30); //das wird undefiniert, file_in fasst nur ein Zeichen, aber 30 sollen gelesen werden... cin.ignore(); cin.get(file_out, 30); //das auch cin.ignore(); Vigenere.file_code(file_in, file_out, 1);Bessere Variante:
std::string fileIn; std::string fileOut; std::getline(std::cin, fileIn, '\n'); std::getline(std::cin, fileOut, '\n'); Vigenere.file_code(fileIn.c_str(), fileOut.c_str(), 1);
-
Entschuldigt die banalität meines Fehlers, aber meine Dateien waren einfach nur im falschen Ordner.

Ich muss diese Methode verwenden, Uni-Aufgabe.
Vielen Dank
-
Seaman schrieb:
Entschuldigt die banalität meines Fehlers, aber meine Dateien waren einfach nur im falschen Ordner.

Ich muss diese Methode verwenden, Uni-Aufgabe.
Vielen Dank
Totzdem produzierst Du undefiniertes Verhalten. Wenn es funktioniert, ist das im Moment reiner Zufall.
-
hat nichts mit dem thema zu tun:
void CKrypto::file_code(const char *file_in, const char *file_out, bool encrypt) { if(dir != true && dir != false) throw invalid_argument(errTxt[5]); ifstream istr(file_in,ios_base::binary); if(!istr) throw domain_error(errTxt[3]);//hier bekomme ich den Fehler ofstream ostr(file_out,ios_base::binary); if(!ostr) throw domain_error(errTxt[4]); char readbuf[_block_length]; do { istr.read(readbuf, _block_length); int nread= istr.gcount(); if(nread>0) { switch(dir) { case true: encode(readbuf, nread); break; case false: decode(readbuf, nread); break; default: assert(false); } ostr.write(readbuf, nread); if(!ostr) throw domain_error(errTxt[2]); } }while(!istr);
-
Seaman schrieb:
Ich muss diese Methode verwenden, Uni-Aufgabe.
Ich denke nicht, dass du fehlerhaft programmieren musst.

Ersetze wenigstens die
new chardurchnew char[n], wobeineine sicher genügend grosse Puffergrösse darstellt. Und vergiss auch nicht, den Speicher mitdelete[]wieder freizugeben.