2010-03-12 8 views

Respuesta

7

No hay un método simple. Lo has hecho manualmente Por ejemplo:

  1. Leer el trozo que desea insertar antes en la memoria
  2. Buscar hacia delante a una nueva posición
  3. Escribir el trozo que acaba de leer en la nueva posición
  4. Busque de nuevo a donde desee insertar
  5. Escriba la nueva información.
+0

¡Gracias! Entonces tengo que usar "fopen (" 1.txt "," w ");" y luego fseek? :) Como te entiendo, la respuesta es sí para mi pregunta. –

+2

@Infinity: Use 'fopen (" 1.txt "," r + ")' que se abre para leer * y * escribir. El modo '" w "' sobrescribe cualquier archivo que pueda haber existido previamente, dejándolo con un archivo vacío. –

+0

bien, gracias :) –

2

Utilice la función fseek para mover el puntero del archivo a la ubicación adecuada del archivo y luego puede realizar una escritura allí. Pero, para esto, debe saber cuántos bytes del final o el comienzo del archivo es su área preferida para escribir.

+0

Gracias a ti también. –

6

Como ya le han dicho otros, tiene que hacerlo manualmente, y usar fseek para llegar al lugar en el que debe insertar o agregar caracteres. Puede agregar fácilmente nuevos caracteres en el medio haciendo lo siguiente:

  1. Vaya al último byte del archivo y almacene el archivo antiguo del archivo.
  2. Vaya a donde desea insertar los nuevos caracteres (por ejemplo, posición): número de bytes (tamaño de archivo antiguo - posición) y guárdelos en un búfer.
  3. fseek a position again.
  4. fwrite sus nuevos personajes.
  5. fEscribe el búfer que has leído anteriormente.

Si desea eliminar caracteres en el medio, entonces esto es más complicado. En realidad, no puedes hacer un archivo más corto. Tiene dos posibilidades: en la primera, que acaba de

  1. abre el archivo y lee el archivo de saltarse los caracteres que desea eliminar y almacenarlos en una memoria intermedia
  2. Cierre y vuelva a abrir el archivo de nuevo con "b", por lo que se borra su contenido,
  3. Escriba el búfer y cierre el archivo.

En la segunda posibilidad, que:

  1. Leer para un buffer de los personajes por delante de las que desee eliminar.
  2. fseek al principio de los caracteres que desea eliminar
  3. fwrite the buffer.
  4. Recorta el resto del archivo.

El punto cuatro es "complicado", porque no hay una forma estándar (portátil) de hacerlo. Una posibilidad es usar las llamadas al sistema operativo del sistema para truncar el archivo. Otra posibilidad más simple es simplemente escribir EOF en el punto 4. El archivo será probablemente más grande de lo que debería ser, pero funcionará.

+0

Muchas gracias, creo que sabes más cosas sobre esto. ¿Podemos hablar un poco sobre esto en otro lugar? –

+0

Me interesa el tema de buscar la posición de un texto en un archivo. Tal vez hay una buena manera o tengo que probar charachter por charachter? –

+0

Buscar en un archivo de texto es, sí, básicamente una cuestión de probar carácter por carácter. Pero ese es otro tema totalmente diferente: puede obtener la ayuda de expresiones regulares, por ejemplo. – Baltasarq

1

Teniendo en cuenta lo que Baltasarq publicó, escribí las siguientes líneas. Es necesario conocer la posición en la que desea insertar los caracteres

long Fin; 
long lSize; 
fseek(fd, 0L, SEEK_END); 
Fin = ftell(fd);//I get the old file size 
fseek(fd, position, SEEK_SET);//you should have declared and initialized "position" 
char * buffer; 
lSize = Fin - position;//lenght from where you want to insert the chars and the eof 

buffer = (char*) malloc(sizeof(char) * lSize); 
size_t result = fread(buffer, 1, lSize, fd);//fread (Fin - position) into buffer 
fseek(fd, position, SEEK_SET);//fseek to position 

fputs(word, fd);//you should know what you want to write (word) and it is a char pointer 
fputs(buffer, fd);//fwrite the buffer 

realidad he usado este código (después de algunas modificaciones) por triplicado a las palabras que contienen cada vocal, en un archivo determinado.

Cuestiones relacionadas