Wie kann ich eine Datei in eine Array laden und wieder zurück speichern?



  • Hallo!

    Wie kann ich z.B. die ersten 10MB einer Datei in einen Array aus unsigned char laden? Wie kann ich den Array dann wieder in einer Datei speichern?

    Viele Grüße
    pmw



  • ifstream::read bzw. ifstream::readsome
    und
    ofstream::write



  • Hi!

    Danke für die Antwort. Leider bringt sie mich aber nicht weiter, da ich nicht weiß was ich jetzt machen soll.

    Viele Grüße
    pmw



  • Hallo,

    was hast du denn jetzt bisher? Oder weisst du überhaupt nicht, wie man ifstream und sowas benutzt? Es gibt hier viele Beispiel, in denen aus Dateien gelesen bzw. in Dateien geschrieben wird.

    Z.B.:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39469

    Vielleicht hilfts dir ja weiter.



  • Hallo!

    Ich habe ein Programm geschreiben das Dateien nach RLE und LZ77 komprimieren kann. Aber bisher ist es sehr langsam, dass liegt daran, dass die Dateien nicht den Speicher geladen werden.

    unsigned char[10*1024*1024]; /* = 10MB */ 
    fstream FDatei;
    FDatei.open("c:\data.bin", ios::in);
    ADatei = FDatei von 0 bis 10*1024*1024 - 1; /* Lade die ersten 10MB */
    FDatei.close();
    
    unsigned char *ADatei;
    fstream FDatei;
    FDatei.open("c:\data.bin", ios::out);
    FDatei = ADatei; /* Datei speichern */
    FDatei.close();
    

    Wie lautet für folgende Dinge der C++ Code?

    ADatei = FDatei von 0 bis 10*1024*1024 - 1;
    FDatei = ADatei;
    

    Ich hoffe, so ist verständlicher, was ich meine.

    Viele Grüße
    pmw



  • Hallo!

    Am Anfang habe ich so schnell Antworten bekommen. Jetzt, wo ich versucht habe mein Anliegen klarer zu formulieren, gab es irgendwie keine Antworten mehr. Ist meine Frage nicht verständlich oder bin ich einfach nur zu ungeduldig?

    Ich habe folgenden ausprobiert, was leider nicht funktioniert:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
      unsigned long long ILaenge;
      char *SQuelleDateiname;
      unsigned char *AQuelle;
      fstream FDatei;
    
      SQuelleDateiname = argv[1];
    
      FDatei.open(SQuelleDateiname, ios::in);
      if (FDatei.is_open() == 0) { 
         cout << "Fehler: Konnte Quelledatei nicht öffnen.\n"; 
         system("PAUSE");	
         exit(0);
      }
      else {
    
         FDatei.seekg(0, ios::end);
         ILaenge = FDatei.tellg();
         AQuelle = new unsigned char[ILaenge]; 
    
         FDatei.seekg(0, ios::beg);
         FDatei.read((char*)AQuelle, ILaenge);
         cout << "<" << AQuelle << ">\n"; 
    
         delete [] AQuelle;
    
      }
    
      FDatei.close(); 
    
      system("PAUSE");	
      return 0;
    
    }
    
    Inhalt Testdatei: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
    
    Ausgabe: <0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ=P       >
    

    Viele Grüße
    pmw



  • Nimm halt internen Buffer

    void convert(const char *in_fname, const char *ou_fname)
    {
    	// create two filebuffers and set buffersize to 1 Meg
    	ifstream in;
    	char     ibuf[1 * 1024 * 1024];
    	in.rdbuf()->pubsetbuf(ibuf, sizeof ibuf);
    
    	ofstream ou;
    	char     obuf[1 * 1024 * 1024];
    	ou.rdbuf()->pubsetbuf(obuf, sizeof obuf);
    
    	// open files
    	in.open(in_fname, ios::binary);
    	if (!in.good()) {
    		cerr << "error opening file" << endl;
    		return;
    	}
    	if (!ou.good()) {
    		cerr << "error opening file" << endl;
    	}
    
    	// read -> convert (if necessary) -> write
    	while (in.good()) {
    		char c;
    		in.get(c);
    		if (c != '\n')
    			ou.put(c);
    		else {
    			ou.put('\r');
    			ou.put('\n');
    		}
    	}
    }
    

    mfg


Anmelden zum Antworten