Datei komplett auslesen



  • Hi

    Ich bin grade dabei eine Klasse für das speichern von mehreren Dateien in einer Datei zu schreiben.
    Mein Problem ist, wie les ich die Dateien ein und schreib sie dann samt zusätzlichen Infos (wie z.b. die Byte-Länge) in die Archivdatei?
    Ich habs mit den fstream Klassen ifstream/ofstream probiert aber es einfach nicht hinbekommen.

    Kann mir jemand ein kleines Codebeispiel geben?
    Danke, Daniel



  • was ist jetzt genau das Problem?

    Ströme und Dateien

    wmfrs



  • Sorry, hatte vorher kaum Zeit. Jetzt nochmal genau:

    Ich benötige eine Klasse um auf Ressourcendateien zugreifen zu können. Mein Problem ist, wie bau ich diese Ressourcendateien auf. Also ich hab mir das so gedacht:

    Zuerst schreib ich ein FileHeader damit ich meine Ressourcendateien auch erkennen kann. Dann kommen die Daten. Ich will in der Datei mehrere Dateien unterbringen und anhand einer ID oder eines Strings erkennen und wieder auslesen können.

    Also habe ich mal eine kleine Klasse gebaut:

    class CFileArchiveFile
    {
    public:
      char * FileData;
      int FileDataLength;
      int ID;
    };
    
    // Die FileArchive-Klasse um die einzelnen Dateien zu verwalten:
    
    class CFileArchive
    {
    public:
      vector<CFileArchiveFile> Files;
      void SaveArchive(char * FileName);
      void AddFileToArchive(char * FileName);
    };
    

    Jetzt habe ich das Problem wie lade ich eine Datei komplett in die CFileArchiveKlasse (in char * FileData) und wie speicher ich das Archiv richtig?
    Bis jetzt lese ich die Datei so aus:

    void CFileArchive::AddFileToArchive(char * FileName)
    {
      ifstream File;
      File.open(FileName);
    
      char TempData[1000];
      File.read(TempData, 1000, 0);
    
      // ...
    }
    

    Aber wenn ich das an einer Bitmapdatei probiere sind nur die ersten 3-4 Zeichen oder so in TempData, wie bekomm ich eine ganze Datei also in die CFileArchiveFile-Klasse?

    Daniel



  • wenn die dateien nicht zu groß sind, dann kannst du das so machen:
    Wenn nicht, dann ist es sowieso nciht gut, die direkt im Speicher zu halten

    void CFileArchive::AddFileToArchive(char * FileName)
    {
      ifstream File;
      File.open(FileName);
    
      char* TempData = new char[File.size()];
      File.read(TempData, File.size());
    
      // Dann steht die gesamte Datei in TempData. 
    
      // ...
    }
    


  • So meine AddFile-Funktion sieht jetzt so aus:

    int CFileArchive::AddFile(char * FileName)
    {
    	CFileArchiveData File;
    	fstream FilePointer;
    
    	FilePointer.open(FileName, ios::in | ios::binary);
    
    	if (FilePointer.is_open())
    	{
    		FilePointer.seekg(0, ios::end);
    		unsigned long FileSize = streamoff(FilePointer.tellg());
    		FilePointer.seekg(0, ios::beg);
    
    		char * TempData = new char [FileSize];	
    		FilePointer.get(TempData, FileSize, 0);
    
    		File.SetData(TempData);
    
    		IDCounter++;
    		File.SetID(IDCounter);
    		File.SetDataSize(FileSize);
    
    		Files.push_back(File);
    
    	}
    
    	return File.GetID();
    }
    

    Leider funktioniert das nur bei Textdateien, wenn ich eine Bitmap oder eine exe-Datei hinzufügen will liest er nur die ersten 4 Zeichen ein. Woran liegt das?

    Daniel



  • du musst die dateien im Binärmodus (ios::binary) öffnen, da sonst die datei nach einem bestimmten Steuerzeichen abgebrochen wird.



  • Hmm, das mach ich doch schon mit FilePointer.open(FileName, ios::in | ios::binary);
    oder nicht?

    Daniel


Anmelden zum Antworten