Tutorial de archivos en lenguaje C. -

Iniciado por NOB2014, 26 Agosto 2016, 14:51 PM

0 Miembros y 1 Visitante están viendo este tema.

MCKSys Argentina

Creo que sera evidente que no soy experto en C/C++, pero no seria valido reemplazar esto:

Código (cpp) [Seleccionar]

...
fprintf(fptr, "%s", recordatorio->nombre);
fprintf(fptr, "%s", recordatorio->direccion);
fprintf(fptr, "%s", recordatorio->ciudad);
fprintf(fptr, "%s", recordatorio->correo);
fprintf(fptr, "%s", recordatorio->telefono);
fprintf(fptr, "%s", recordatorio->celular);
fprintf(fptr, "%s", recordatorio->otros);
...


por algo como esto?

Código (cpp) [Seleccionar]

...
fprintf(fptr, "%s,%s,%s,%s,%s,%s,%s", (recordatorio->nombre, recordatorio->direccion, recordatorio->ciudad, recordatorio->correo, recordatorio->telefono, recordatorio->celular, recordatorio->otros));
...


Desconozco si fprintf se puede usar de esa forma, pero imagino que debe existir algo como para hacer eso y separar los valores usando comas (como en el ejemplo) o usando ";" o el separador que sea...

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


NOB2014

#11
Hola, coterráneo.
Parece que igual toma el salto de linea '\n', me da el mismo resultado, tu código tiene 2 paréntesis de más. -
Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

NOB2014

Ya lo solucione, dejo el código por si a alguien le pasa algo parecido. -


void reemplazar( Recordatorio *recordatorio ){
char *p=NULL;
if((p=strchr(recordatorio->nombre, '\n'))){
*p='|';
}
if((p=strchr(recordatorio->direccion, '\n'))){
*p='|';
}
if((p=strchr(recordatorio->ciudad, '\n'))){
*p='|';
}
if((p=strchr(recordatorio->correo, '\n'))){
*p='|';
}
if((p=strchr(recordatorio->telefono, '\n'))){
*p='|';
}
if((p=strchr(recordatorio->celular, '\n'))){
*p='|';
}
if((p=strchr(recordatorio->otros, '\n'))){
*p='|';
}
}

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

NOB2014

#13
3 - Posicionarse en el último registro.  

Si tengo lo siguiente en el archivo. -

Citar1 - xxxxxxxx|xxxxxxxxxxxx|xxxxx
2 - xxxxxxxx|xxxxxxxxxxxx|xxxxx
3 - xxxxxxxx|xxxxxxxxxxxx|xxxxx
4 - xxxxxxxx|xxxxxxxxxxxx|xxxxx
5 - xxxxxxxx|xxxxxxxxxxxx|xxxxx
6 - xxxxxxxx|xxxxxxxxxxxx|xxxxx
7 - xxxxxxxx|xxxxxxxxxxxx|xxxxx
Lo que quiero es recuperar el número 7 para agregarle 1 y así tener un orden de ingreso, me podrían dar alguna idea de como intentarlo. -
Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

AlbertoBSD

Cuando se tiene registros de longitud dinamica, y no tienes los datos cargados en memoria tienes que leerlos todos y reescribir todo el archivo o solo desde la parte que cambio.

Segun se te facilite si lo reescribe todo solo haces un ciclo y escribes desde 0 todo.

Si solo quieres modificar la parte modificada, tienes que situarte donde finaliza el ultimo registro no afectado fseek() y empezar a escribir apartir de ahi

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Hola.
Al fin parece que lo conseguí. -
Una consultita, hay otra manera para hacer lo mismo sin utilizar '\n'. -
FILE *fptr = fopen( "fichero.txt", "r+" );

orden = cantCampos( fptr, orden );

int cantCampos( FILE *fptr, int orden ){
char caracter;
while ( !feof ( fptr ) ){
caracter = getc( fptr );
if( caracter == '\n' )
orden++;
}

return orden;
}

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

NOB2014

#16
Hola, gente. -
Tengo un inconveniente con el siguiente código, como se muestra en la captura hace como un enter en el último campo antes de tiempo, hice unos cambios para solucionarlo y nada, los primeros 7 registros los alinee a mano. -


4 - Salto de línea anticipado en el último campo.




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

void limpiar( void );

int main( void ){
int n = 1, ch, orden=-1;
char nombre[80], caracter;
double salario;
FILE *pArchivo = fopen( "pruebaE.txt", "a+" );
if( pArchivo != NULL ){
while ( !feof ( pArchivo ) ){
caracter = getc( pArchivo );
if( caracter == '\n' )
orden++;
}
do{
limpiar();
orden++;
printf( "\n\n El proximo empleado es el numero..: %d", orden );
printf( "\n\n Introduzca 0 para finalizar mayor para continuar.....:" );
scanf( "%d", &n );
while ((ch = getchar()) != EOF && ch != '\n');
if( n > 0 ){
printf( "\n Introduzca el NOMBRE del empleado.....:" );
fgets( nombre, 80, stdin );
printf( "\n Introduzca el SALARIO del empleado....:" );
scanf( "%lf", &salario );
while ((ch = getchar()) != EOF && ch != '\n');

fprintf( pArchivo, "%d\t%s\t%lf \n", orden, nombre, salario );
}
}while( n > 0 );

fclose( pArchivo );
}else{
printf( "\n Error al abrir %s para escritura/lectura. Finaliza el programa.", "pruebaE" );
}


return 0;

}

void limpiar( void ){
system("cls||clear");
}



Desde ya muchas gracias, saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

AlbertoBSD

Es raro que te de ese error si es el mismo codigo que se uso no deberia de agregar ese enter de mas...

Sanitiza la entrada del nombre quitandole el \n o \r que quede atorado ahi:


char *busqueda = NULL;
fgets( nombre, 80, stdin );
busqueda = strstr(nombre,"\n");
*busqueda = '\0';
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Hola, Alberto, buen día. -
No es el mismo código y cometí 2 veces el mismo error ,  fgets en casi todos los casos al final de la cadena pone el salto de línea y eso hacia que el último campo se escribiera mal en el archivo. -
Tengo otra consulta para hacerles, lo que ocurre es que tengo el programa para escribir y leer el archivo en distintas carpetas ¿alguien sabe cómo abrir archivo en Linux que estén en una carpeta distinta a la que se encuentraa el programa? -

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

AlbertoBSD

Hay varias formas para hacer esto.

Hay que usar la ruta absoluta o la ruta relativa.

Esto es con ruta absoluta:

archivo = fopen("/usr/home/usuario/directorioX/archivo.txt","r");

O con ruta relativa (relativa al directorio actual de trabajo), suponiendo que estemos ya en el directorio usuario y asumiendo que el directorioX exita:
archivo = fopen("./directorioX/archivo.txt","r");

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW