2010-12-21 14 views
5

El problema es que estoy en medio de un archivo con fseek A continuación hay algunos bytes de longitud m que quiero reemplazar con bytes de longitud n. simple write mantendrá m-n bytes todavía allí. Si m > n y si m < n algunos bytes (n-m) que no estoy dispuesto a cambiar serán sobrescritos.sobrescribir en medio de un archivo

Solo quiero reemplazar un startPos to endPos Byte Stream conocido con Bytes de longitud variable. Cuál es la mejor solución.

- EDITAR - Aunque se puede hacer tomando una copia de seguridad. ¿Existe alguna solución directa? Esto es demasiado sucio? y tipo de codificación pobre.

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) 

// Ahora copia de respaldo de originales

+3

Vuelva a escribir el archivo. –

+0

@ user256007, creo que sus puntuaciones y algunas letras de capitalización me resultan desconcertantes. –

+0

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

Respuesta

5

La solución más robusta es volver a escribir todo el archivo, a partir de cero. La mayoría de los sistemas operativos solo le permitirán sobrescribir bytes, no insertarlos ni eliminarlos, de un archivo, por lo que para lograr eso, básicamente debe copiar el archivo, reemplazando los bytes de destino durante la copia.

+0

Pero de esa manera parece una codificación pobre de mans Mans Mans. –

+0

@ user256007 Como dijo @Thanatos, realmente solo puede sobrescribir o anexar bytes. Si necesita insertar, normalmente debe crear un nuevo archivo, escribir en él y luego moverlo sobre el original. –

0

El uso de la biblioteca fstream, aquí es una implementación sencilla de lo que los otros puede ser que diga

/** 
* 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; 
} 

Usted podría podría hacer todo su búsqueda en la función readFile o simplemente en la matriz de caracteres (en este caso leer) Desde allí, puede almacenar las posiciones y usar la función writeFile() de manera apropiada.

¡Buena suerte!
Dennis M.

Cuestiones relacionadas