Duda sobre manejo de un FICHERO

vic
23 de Febrero del 2004
Hola!,
tengo q insertar un nuevo valor a una variable llamada ID de un fichero txt. lo lógico es hacer una búsqueda de ID, saber la posición de éste en el fichero y con FSEEK() posicionarse, para luego con FPUTS() escribir el valor.
lo q no sé es cómo obtener la posición de ID en el fichero para luego utilizarla en FSEEK().

ahora mismo lo tengo puesto a capón (por ej: 1234) y funciona bien, pero esto es una chapuza pq si se añade una nueva linea se nos ha fastidiao el truco!.

Alguien sabe cómo hacerlo??
Muchas gracias!.

dvaccaro
23 de Febrero del 2004
Basicamente la funcion:

int fgetpos( FILE *stream, fpos_t *pos )

retorna la posicion actual del puntero de archivo

saludos
Daniel

dvaccaro
23 de Febrero del 2004
Recapitulé y es mas apropiado en este caso usar

long ftell ( FILE *stream )

Saludos
Daniel

vic
23 de Febrero del 2004
vale, con ftell obtengo la posición, y cómo consigo llegar hasta la posición deseada?. recorriendo el fichero, linea por linea y comparando la linea con el string q quiero encontrar????
cómo puedo hacer un while para cada linea, while(fin de linea)????

gracias!

dvaccaro
23 de Febrero del 2004
Te mando algo que te puede ayudar

Saludos
Daniel

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

/*
Suponemos un archivo de texto con los campos delimitados
por tabs ( t ) y tambien suponemos que el ancho del campo
ID es fijo es decir el cero seria 0000 hasta llegar al 9999
si necesitamos mas registros seria 0000000 - 9999999 pero
siempre respetando un ancho fijo de modo tal que la operacion
sea de sobrescritura y no de insercion o eliminacion de
caracteres en el archivo, esto hace que el algotitmo se
mas sencillo
*/


// Estructura para almacenar los valores de los campos
typedef struct Registro
{
char sID[8];
char Apellido[20];
char Nombre[20];
};

void main( void )
{
Registro reg;
FILE *fp;
if( !( fp = fopen ( "c:\IDs.txt", "rt+" )))
{
printf( "nERROR Abriendo archivo de entradan" );
exit( 1 );
}
// ID que buscamos para reemplazar
unsigned long ID = 2145;
char sID[8];
// Convertimos el ID a string
ltoa( ID, sID, 10 );
// Varable para almacenar el puntero de archivo
long save_pos,pos = 0L;
// Mientras funcione el fscanf y no sea fin de archivo
while( !feof( fp ) && fscanf( fp, "%st%st%sn", &reg.sID, &reg.Apellido, &reg.Nombre) == 3)
{
// Buscamos el ID deseado
if( !strcmp( sID, reg.sID ))
{
// Si lo encontramos
printf("Lo encontre !!!n");
// Almacenamos la posicion actual del puntero de archivo
save_pos = ftell( fp );
// Llevamos el puntero al inicio de la linea actual
fseek( fp, pos, SEEK_SET );
// Grabamos el nuevo valor de ID
fputs( "1234", fp );
// Recuperamos la posicion del puntero de archivo
fseek( fp, save_pos, SEEK_SET );
}
else
pos = ftell( fp );
}
fclose( fp );
}