Foros del Web » Programación para mayores de 30 ;) » Programación General »

modificar una sola linea en fichero en lenguaje c

Estas en el tema de modificar una sola linea en fichero en lenguaje c en el foro de Programación General en Foros del Web. miren el problema es que tengo un archivo creado, lo que quiero es abrirlo, leerlo y editar una solo parte, una linea la que yo ...
  #1 (permalink)  
Antiguo 05/11/2005, 20:12
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
modificar una sola linea en fichero en lenguaje c

miren el problema es que tengo un archivo creado,

lo que quiero es abrirlo, leerlo y editar una solo parte, una linea la que yo quiera


yo estoy usando fseek que supuestamente me permite colocar el cursor donde me de la gana pero no lo hace.
  #2 (permalink)  
Antiguo 06/11/2005, 06:16
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Efectivamente fseek es para mover el puntero del archivo, deberia funcionarte. ¿Que te devuelve la funcion fseek?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 06/11/2005, 10:13
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
me esta devolviendo un -1.

le estoy indicando que se mueva a la posicion 5
fseek(fichero,5,SEEK_SET);
  #4 (permalink)  
Antiguo 06/11/2005, 10:20
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Vamos a lo simple: ¿Fichero es un handle valido? ¿El archivo tiene cuanto menos 5 bytes?

¿Que compilador usas?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 06/11/2005, 10:35
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
si a las dos primeras preguntas y uso el turbo c++
  #6 (permalink)  
Antiguo 06/11/2005, 13:17
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Turbo c++ no me extraña que tengas problemas ...

Si posteas el codigo en cuestion, la forma de abrir el archivo especialmente, tal vez podamos solucionarlo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 06/11/2005, 16:46
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
este es uno de muestra pero asi es que lo estoy abriendo.

void main(){
clrscr();
char nombre[]="juan.txt";
int resultado;
FILE *fichero;
fichero=fopen(nombre,"a+");
resultado=fseek(fichero,5,SEEK_SET);
printf("%i",resultado);
getch();
fprintf(fichero,"jajajajajaj");

if(fclose(fichero)!=0){
printf("problemas al cerrar");
getch();
}
}

esta es la prueva que ya logre que me devuleva un 0 en resultado pero cuando voy a ver el archivo el lo ha escrito al final del archivo no entinedo por que a ver si tu sabes por que.

y una pregunta "¿por que dijiste "Turbo c++ no me extraña que tengas problemas "?
  #8 (permalink)  
Antiguo 07/11/2005, 02:12
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
MSDN:
"When a file is opened with the "a" or "a+" access type, all write operations occur at the end of the file. The file pointer can be repositioned using fseek or rewind, but is always moved back to the end of the file before any write operation is carried out. Thus, existing data cannot be overwritten."

Tenes que abrirlo con r+ si el archivo ya existe y sino con w+.

"r+"
Opens for both reading and writing. (The file must exist.)
"w+"
Opens an empty file for both reading and writing. If the given file exists, its contents are destroyed.

Lo de Turbo C++ lo digo por un par de razones, primero y principal es un compilador de 16 bits para MS-DOS y segundo, y no menos importante, es Borland una empresa que segun mi experiencia personal se caracteriza por desarrollar productos de baja calidad.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 07/11/2005, 20:13
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
ok gracias pero ahora tengo un problema, yo quiero vorar lo que tengo escrito. y para eso estoy diciendo que escriba backspace,

fprintf(fichero,"%c",8);

pero en ves de borar el lo que me esta escribiendo [][][] unos cuadritos. no se por que pasa esto.
  #10 (permalink)  
Antiguo 08/11/2005, 01:27
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Te pasa eso porque no es una consola (de pantalla) sino un archivo y entonces lo que estas haciendo es poner en el archivo el numero 8.

¿Lo que queres borrar esta al final del archivo? Sino no se puede borrar, lo unico que podes hacer es ponerlo a 0.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 08/11/2005, 20:35
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
ok, tu me quieres decir que si lo que quiero borrar no esta al final del archivo no lo puedo borrar .

ahora que diablos puedo hacer si lo que quiero es sustituir lo que esta ahi por otra cosa.
  #12 (permalink)  
Antiguo 09/11/2005, 01:25
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
¿Como lo vas a borrar? Tendrias que mover, literalmente, los datos que estan justo despues al punto de borrado.

Si lo que queres es sustituirlos solo tenes que situar el puntero del archivo en la posicion deseada y escribir.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #13 (permalink)  
Antiguo 09/11/2005, 11:57
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
pero lo que pasa cuando hago eso es que arrastra lo que estaba escrito y eso no me sirve. lo que quiero es quitarlo por completo.
  #14 (permalink)  
Antiguo 09/11/2005, 12:28
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Entonces podes intentar leer lo que sigue al area que queres borrar (hasta el final del archivo), reescribirlo y despues truncar el tamaño a el total menos el area que queres borrar.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #15 (permalink)  
Antiguo 09/11/2005, 16:27
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
si ya eso lo pense pero queria saber si habia una forma mas facil y comoda de hacerlo.
  #16 (permalink)  
Antiguo 10/11/2005, 01:27
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por chrno
si ya eso lo pense pero queria saber si habia una forma mas facil y comoda de hacerlo.
En este momento no se me ocurre ninguna.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #17 (permalink)  
Antiguo 11/11/2005, 21:51
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
bueno ahora tengo otro problema,
supuestamente cuando uso fgets y que el no encuentra nada el debe devolverme un NULL, peor en ves de eso el me esta frisando el programa.
puedes explicarme por que hace esto.
  #18 (permalink)  
Antiguo 12/11/2005, 03:44
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por chrno
bueno ahora tengo otro problema,
supuestamente cuando uso fgets y que el no encuentra nada el debe devolverme un NULL, peor en ves de eso el me esta frisando el programa.
puedes explicarme por que hace esto.
fgets no es para buscar, es para recibir datos del teclado. Si se queda bloqueado es porque no debes escribir nada. Lo que tenes que hacer es cargar el archivo en memoria y buscar la cadena con strstr por ejemplo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #19 (permalink)  
Antiguo 24/11/2005, 22:05
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
disculpa que aya tardado tanto en responder.

pero a lo que me referia antes es que fgets lee la linea en que se encuentra el curson y pasa el cursor a la otra linea en el archivo que ya eh abierto, pero si en la linea que el lee no hay nada el debuelve un NULL, o eso se supone, porque me esta frisando el programa.

espero que ahora si me hayas entendido.
  #20 (permalink)  
Antiguo 25/11/2005, 00:25
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por chrno
disculpa que aya tardado tanto en responder.

pero a lo que me referia antes es que fgets lee la linea en que se encuentra el curson y pasa el cursor a la otra linea en el archivo que ya eh abierto, pero si en la linea que el lee no hay nada el debuelve un NULL, o eso se supone, porque me esta frisando el programa.

espero que ahora si me hayas entendido.
Si, ahora te entendi y como decis devuelve NULL (0) cuando no hay mas texto. Aca tenes un ejemplo de la MSDN:

Código:
// crt_fgets.c
/* This program uses fgets to display
 * a line from a file on the screen.
 */

#include <stdio.h>

int main( void )
{
   FILE *stream;
   char line[100];

   if( (stream = fopen( "crt_fgets.txt", "r" )) != NULL )
   {
      if( fgets( line, 100, stream ) == NULL)
         printf( "fgets error\n" );
      else
         printf( "%s", line);
      fclose( stream );
   }
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #21 (permalink)  
Antiguo 25/11/2005, 10:07
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii


gracias, con ese ejemplo me di cuenta de mi error. al fin podre terminar el programa.

loko eres lo maximo. gracias, gracias.
  #22 (permalink)  
Antiguo 25/11/2005, 10:08
 
Fecha de Ingreso: junio-2005
Mensajes: 119
Antigüedad: 18 años, 10 meses
Puntos: 0
siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii


gracias, con ese ejemplo me di cuenta de mi error. al fin podre terminar el programa.

loko eres lo maximo. gracias, gracias.
  #23 (permalink)  
Antiguo 25/11/2005, 11:10
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
De nada, me alegro de que te/les haya servido
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:29.