2010-12-21 17 views
5

Das Problem ist, ich bin in der Mitte einer Datei mit fseek Next existiert einige Bytes der Länge m, die ich mit Bytes der Länge n ersetzen möchte. einfach write wird m-n Bytes noch da bleiben. Wenn m > n und wenn m < n werden einige Bytes (n-m), die ich nicht bereit bin zu ändern, überschrieben werden.in der Mitte einer Datei überschreiben

Ich möchte nur eine bekannte startPos to endPos Byte Stream mit variabler Länge Bytes ersetzen. Was ist die beste Lösung?

- EDIT - Obwohl es durch ein Backup durchgeführt werden kann. Gibt es eine direkte Lösung? Das ist zu chaotisch? und Art der schlechten Codierung.

o = fopen(original, 'r') 
b = fopen(backup, 'w') 
while(fpos(o) <= startPos){ 
    buffer += fgetc(o) 
} 
fwrite(b, buffer) 
fwrite(b, replaceMentBytes) 
buffer = "" 
fseek(o, endPos) 
while(!feof(o)){ 
    buffer += fgetc(o) 
} 
fwrite(b, buffer) 

// jetzt Copy Sicherung Original

+3

Die Datei neu schreiben. –

+0

@ user256007, denke ich, dass Ihre Interpunktionen und einige Buchstaben Großschreibung für mich rätselhaft sind. –

+0

Siehe http://blogs.msdn.com/b/oldnewthing/archive/2010/12/01/10097859.aspx – MSalters

Antwort

5

Die robusteste Lösung ist die gesamte Datei neu zu schreiben, von Grund auf neu. Bei den meisten Betriebssystemen können Sie nur Bytes überschreiben, sie nicht einfügen oder aus einer Datei entfernen. Um dies zu erreichen, müssen Sie die Datei im Wesentlichen kopieren und die Zielbytes während der Kopie ersetzen.

+0

Aber so sieht Sieht aus wie ein armer Mans armer mans Codierung. –

+0

@ user256007 Wie @Thanatos sagte, können Sie Bytes wirklich nur überschreiben oder anhängen. Wenn Sie etwas einfügen müssen, müssen Sie normalerweise eine neue Datei erstellen, darauf schreiben und sie dann über das Original bewegen. –

0

die fstream Bibliothek verwenden, hier ist eine einfache Implementierung von dem, was die andere könnte

/** 
* Overwrite a file while replacing certain positions 
*/ 

#include <iostream> 
#include <fstream> 

using namespace std; 

int readFile(char* filename,int& len,char*& result) 
{ 
    ifstream in(filename); // Open the file 
    if(!in.is_open()) 
     return 1; 

    // Get file length 
    in.seekg(0,ios::end); 
    len = (int)in.tellg(); 
    in.seekg(0,ios::beg); 

    // Initialize result 
    result = new char[len+1]; 

    // Read the file and return its value 
    in.read(result,len); 

    // Close the file 
    in.close(); 

    return 0; 
} 

void writeFile(char* filename,char* data,int from,int to,int origdata,int trunc) 
{ 
    ofstream out; 
    (trunc == 1) ? out.open(filename,ios::trunc) : out.open(filename,ios::app); // Simple ternary statement to figure out what we need to do 

    // Find position if we're not starting from the beginning 
    if(trunc == 1) 
     out.seekp(from); 
    else // Otherwise send us to the beginning 
     out.seekp(0,ios::beg); 

    if(origdata == 1) // If we need to start in the middle of the data, let's do so 
     for(int i=0;i<(to-from);++i) 
      data[i] = data[from+i]; // Reverse copy 

    out.write(data,(to-from)); 

    out.close(); 
} 

int main() 
{ 
    char* read; 
    int len = 0; 
    if(readFile("something.txt",len,read) != 0) 
    { 
     cout<< "An error occurred!" << endl; 
     return 0; 
    } 

    // Example to make this work 
    cout<< "Writing new file...\r\n"; 
    writeFile("something.txt",read,0,20,1,1); // Initial write 
    writeFile("something.txt","\r\nsome other mumbo jumbo",21,45,0,0); 
    writeFile("something.txt",read,46,100,1,0); // Replace the rest of the file back 

    cout<< "Done!\r\n"; 
    cin.get(); // Pause 
    delete [] read; 
    return 0; 
} 

Sie würden alles tun, könnten Ihren seeking in der Funktion Readfile oder einfach in dem char-Array sagen (in diesem Fall lesen). Von dort können Sie die Positionen speichern und die Funktion writeFile() entsprechend verwenden.

Viel Glück!
Dennis M.

Verwandte Themen