fstream, warum bekomme ich in der klasse segfaults???
-
So, nochmal das Minimalbeispiel bei dem ich definitiv einen Absturz bekomme:
Was dubios ist, selbst wenn ich bootsector als lokale Variable definiere schmiert das Ding ab, daran liegt es also nicht. Wenn ich auf ein File Verweise dass nicht existiert geht der Code, er bricht als beiif (!is.is_open())
richtigerweise ab.
Main.cpp
#include "Bootsector.h" int main(int argc, char**argv) { Bootsector bs; string filename = "Windows7FreshDropperStage1.dd"; bs.read(filename); }Bootsector.h
#pragma once #pragma pack(1) #include <stdint.h> #include <string> #include <iostream> #include <fstream> using namespace std; class Bootsector { private: char bootsector[512]; public: Bootsector() {} bool read(string filename); };Bootsector.cpp
#include "Bootsector.h" bool Bootsector::read(string filename) { ifstream is; is.open(filename, ios::binary); if (!is.is_open()) { return false; } is.read((char*)bootsector, 512); is.close(); }
-
Also ich kann keinen Fehler sehen, mein Visual Studio meldet auch nix.
Was nutzt du denn für einen Compiler/Umgebung etc.?
-
void open (const char* filename, ios_base::openmode mode = ios_base::in);
-
EOP_hat_wiedermal schrieb:
void open (const char* filename, ios_base::openmode mode = ios_base::in);
Offensichtlich ist der Compiler schon moderner als du.
-
Was soll das pragma pack da?
-
pragma pack(1)vor den includes ist wohl das Problem.
Die gesamten headaer files inBootsector.hist Quark. Inkludier dort nur was Du brauchst (<string>im Beispiel). In der *.cpp genauso (nur was Du dort brauchst).
`using namespace std;` hat in einem Header nix verloren.
Dein read() hat keinen Rückgabewert (siehe dachschadens Posting).
-
manni66 schrieb:
Was soll das pragma pack da?
Doch nicht so ganz minimal wie ich dachte. Das brauche ich im restlichen Code für meine structs damit ich kein 32bit alignment habe. Vergiss die Zeile hier einfach. Ist mir durchs Copy&Paste reingerutscht
-
Furble Wurble schrieb:
pragma pack(1)vor den includes ist wohl das Problem.
Die gesamten headaer files inBootsector.hist Quark. Inkludier dort nur was Du brauchst (<string>im Beispiel). In der *.cpp genauso (nur was Du dort brauchst).
`using namespace std;` hat in einem Header nix verloren.
Dein read() hat keinen Rückgabewert (siehe dachschadens Posting).
Hm. Tastächlich. Pragma Pack war das Problem. Nur wieso? Das sollte dem Compiler doch eigentlich nur mitteilen alle Structs im Byte Alignment anzuordnen...
-
Wie ist denn generell so die vorgehensweise:
Sollte im Header File nur dass inkludiert werden was ich für das Header File brauche und im CPP File nur dass was fürs CPP nötig ist?
-
Habs gelöst. Pragma Pack hat sich logischerweise auch auf alle include files ausgewirkt weil es davor stand, und somit auch auf meine ifstream klasse.
-
Du kann jedoch gerne noch ein pragma push und pop einfügen, um das Alignment danach wieder zurückzusetzen.
-
Techel schrieb:
Du kann jedoch gerne noch ein pragma push und pop einfügen, um das Alignment danach wieder zurückzusetzen.
Wie funktioniert das mit pragma push und pop? Kenne das nicht.
-
Procrash schrieb:
Wie funktioniert das mit pragma push und pop? Kenne das nicht.
Wieso verwendest du das dann?
Keine Gewähr, dass das so funktioniert, den Code habe ich so bei mir drin, bin aber noch nicht dazu gekommen zu testen:
/*Wir wollen 1-Byte-Alignment haben*/ #pragma pack(push,1) /*Jetzt haben wir 1-Byte-Alignment, hier kommen jetzt unsere Typen:*/ struct winapi_registry_timezone_date { uint16_t year; uint16_t mon; uint16_t wday; uint16_t wmon; uint16_t hour; uint16_t min; uint16_t sec; uint16_t ms; }; /*Und damit der Rest nicht kaputtgeht ...*/ #pragma pack(pop)
-
manni66 schrieb:
EOP_hat_wiedermal schrieb:
void open (const char* filename, ios_base::openmode mode = ios_base::in);
Offensichtlich ist der Compiler schon moderner als du.
Das ist O-Ton cppreference.com.
void open( const std::string &filename, ios_base::openmode mode = ios_base::in ); (2) (since C++11)hab ich erst jetzt entdeckt. Keine Ahnung, wo ich vorhin nachgesehen hab, daß da nur die vorherige Version stand.
-
Danke