Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - NOB2014

#101
Hola, crack81, como estas.
Tal vez no leíste por donde venia el tema o no me supe explicar en el post anterior. -

CitarHola esta bien tu código pero me pregunto, necesitas un arreglo para almacenar los registro y otro del mismo tamaño para saber en que posición se encontrarían ordenados? siendo muy estrictos realmente no es un método de ordenamiento ya que los datos siguen como en su estado original.
Lo que quiero lo vas a entender mejor en la imagen que dejo a continuación, es para un traductor inglés/español y ordenándolo de esta manera por Ej. no necesito hacer un archivo temporal o en memoria para hacer que se muestre en un determinado orden, puedo ordenar el archivo por las palabras en inglés, en español y de forma natural, como se ingresaron los datos. -
Ahora desconozco si esto es más lento o rápido que tener los datos ordenados físicamente, lo que estoy seguro es que no necesito 5 archivos por si hay 5 campos por ordenar, simplemente se agregan tantas columnas como sea necesarias y listo. -
De cualquier manera por el momento no deseo competir con creadores de bases de datos, aunque debo reconocer que es mi fuerte. -



Saludos, un abrazo.

#102
Hola, a todos.
Alberto, muy interesante lo que propones lo voy a llevar a la práctica para ver si lo logro, en realidad muy interesante. -
A continuación, dejo una manera que me vino a la mente y parece que puede dar resultado, lo dejo a su consideración para que me digan si lo puedo mejorar y que les parece la velocidad que se puede obtener al ordenar de esta manera. -

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

int main(void){
int numeros[10] = {0}, ordenar[10] = {0}, ingreso = 0;
int i, j;

for( i=0; i<10; i++ ){
printf(" \n Ingrese un entero (cero para finalizar)....: ");
scanf("%d", &ingreso);

if( ingreso == 0 ){
break;
}

numeros[i] = ingreso;
ordenar[i] = 1;

if( i > 0 ){
j=0;
while( j < i ){
if( ingreso < numeros[j] ){
ordenar[j] += 1;
}else{
ordenar[i] += 1;
}
j++;
}
}
}

printf("\n\n  Numeros ==> ");
for( i=0; i<10; i++ ){
printf("%2d ", numeros[i]);
}
printf("\n  Ordenar ==> ");
for( i=0; i<10; i++ ){
printf("%2d ", ordenar[i]);
}

return 0;
}

     
     

Como comprenderán es solo una practica luego tengo que insertarlo en el programa de archivo binario. -

Saludos.
#103
8 - Ordenar

Hola, gente. -
Una vez más con una duda sobre archivos ahora binario, lo que quiero hacer es por cada ingreso que quede ordenado, también podría ser ordenar todo el archivo cada vez que sea necesario, en definitiva, lo que necesito es que me den alguna idea de como hacerlo y que tengan en cuenta que aproximadamente puede contener unos 15.000 registros. -  
muchas gracias Alberto por las ideas del post anterior.

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

typedef struct {
int  habilitado;
char ingles[30];
char espaniol[30];
}Idiomas;

#define MAX_CAR 30

void menu( char *nombreArchivo );
long contar( char *nombreArchivo );
int contarMarcados( char *nombreArchivo );
Idiomas agregar( void );
void guardar( Idiomas idiomas, char *nombreArchivo );
void mostrar( char *nombreArchivo );
void buscar( char *nombreArchivo );
void modificarBorrar( FILE *file, Idiomas idiomas );
void limpiar( void );
void dibujo( void );

int main( void ){
char nombreArchivo[] = "traductor.bin";

menu( nombreArchivo );

return 0;
}

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

long contar( char *nombreArchivo ){

FILE *file = fopen( nombreArchivo, "r" );
long numeroRegistros;

fseek(file, 0, SEEK_END);  /* Nos situamos al final del mismo */

/* ftell devuelve el numero de bytes desde el principio del fichero
hasta la posicion actual que es el final del fichero */

numeroRegistros = ftell( file )/sizeof( Idiomas );
fclose( file );

return numeroRegistros;
}

int contarMarcados( char *nombreArchivo ){
int marcados = 0;

FILE *file = fopen( nombreArchivo, "rb" );

if( file != NULL ){
Idiomas idiomas;
rewind( file );
while( fread( &idiomas, sizeof(Idiomas), 1, file )){
if( idiomas.habilitado == 0 ){
marcados++;
}
}
}else{
printf( "\n Error al abrir %s para escritura/lectura. Finaliza el programa.", nombreArchivo );
}

fclose( file );

return marcados;
}

void menu( char *nombreArchivo ){
int opc, ok, ch, marcados;
long numeroRegistros = 0;

do{
do{
limpiar( );
numeroRegistros = contar( nombreArchivo );
marcados = contarMarcados( nombreArchivo );
dibujo();
printf( "\n Cuenta hasta el momento con [%ld] palabra(s) traducida(s).", numeroRegistros );
printf( "\n Tiene [%d] registro(s) marcado(s) para borrar.", marcados);
dibujo();
printf( "\n =============== Menu principal ===============\n"
"\n [1] - Agregar"
"\n [2] - Listar"
"\n [3] - Buscar (-> Modificar -> Borrar)"
"\n [4] - Empaquetar"
"\n [5] - Finalizar"
"\n\n ingrese opcion.....:" );

ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 5;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );


switch ( opc ){
case 1: guardar( agregar(), nombreArchivo );
break;
case 2: mostrar( nombreArchivo );
break;
case 3: buscar( nombreArchivo );
break;
}
}while( opc != 5 );
}

Idiomas agregar( void ){
Idiomas idiomas;
char *p=NULL;

idiomas.habilitado = 1;

limpiar();

printf( "\n Introduzca palabra en ingles......:" );
fgets( idiomas.ingles, MAX_CAR, stdin );
if(( p=strchr( idiomas.ingles, '\n' )) ){ *p='\0'; }

printf( "\n Introduzca traduccion al español..:" );
fgets( idiomas.espaniol, MAX_CAR, stdin );
if(( p=strchr( idiomas.espaniol, '\n' )) ){ *p='\0'; }

return idiomas;
}

void guardar( Idiomas idiomas, char *nombreArchivo ){
FILE *file = fopen( nombreArchivo, "ab" );

if( file != NULL ){
fwrite( &idiomas, sizeof(Idiomas), 1, file );
}else{
printf( "\n Error al abrir %s para escritura/lectura. Finaliza el programa.", nombreArchivo );
}

fclose( file );
}

void mostrar( char *nombreArchivo ){
FILE *file = fopen( nombreArchivo, "rb" );

limpiar();

if( file != NULL ){
Idiomas idiomas;
dibujo();
printf( "\n %-30s %-30s\n", "Ingles", "Espaniol" );
while( fread( &idiomas, sizeof(Idiomas), 1, file )){
printf( "\n %-30s %-30s", idiomas.ingles, idiomas.espaniol );
}
dibujo();
}else{
printf( "\n Error al abrir %s para escritura/lectura. Finaliza el programa.", nombreArchivo );
}
printf( "\n\n Pulse una tecla para continuar..." ); getchar();
fclose( file );
}

void buscar( char *nombreArchivo ){
FILE *file = fopen( nombreArchivo, "rb" );
Idiomas idiomas;
char buscar[MAX_CAR], *p=NULL;
int encontrado;

limpiar();

if( file != NULL ){
printf( "\n Ingrese la palabra a buscar....: " );
fgets( buscar, MAX_CAR, stdin );

if(( p=strchr(buscar, '\n' )) ) { *p='\0';}

while( fread( &idiomas, sizeof(Idiomas), 1, file )){
encontrado = strcmp( idiomas.espaniol, buscar );
if( encontrado != 0 ){
encontrado = strcmp( idiomas.ingles, buscar );
}
if( encontrado == 0){
break;
}
}
if( encontrado != 0 ){
printf( "\n No existe..." );
printf( "\n\n Pulse una tecla para volver al menu..." ); getchar();
}else{
modificarBorrar( file, idiomas );
}

fclose( file );
}
else{
printf( "\n Error al abrir %s para lectura. Finaliza el programa.", nombreArchivo );
}

}

void modificarBorrar( FILE *file, Idiomas idiomas ){
int opc=0, ok, ch;

do{
limpiar( );

dibujo();
printf( "\n %-30s %-30s\n", "Ingles", "Espaniol" );
printf( "\n %-30s %-30s", idiomas.ingles, idiomas.espaniol );
dibujo();

printf( "\n\n ========== Modificar/borrar registro ==========\n"
"\n 1 - Modificar"
"\n 2 - Borrar"
"\n 3 - Continuar"
"\n\n ingrese opcion.....:" );

ok = scanf( "%d", &opc ) == 1 && opc > 0 && opc <= 3;
while ((ch = getchar()) != EOF && ch != '\n');
}while( !ok );


switch ( opc ){
case 1: ;
break;
case 2: ;
break;
case 3: break;
}
}

void dibujo( void ){
int con = 0;
printf( "\n" );
while( con <= 75 ){
printf( "-" ); con++;
}
}


Saludos.
#104
 7 - Borrar registro


Hola, que tengan un muy buen día. -
El tema pasa ahora por borrar un registro del archivo y me gustaría que me den su criterio para hacer esta operación, yo he leído que hay 2 maneras de hacerlo, la primera consiste en tener un campo para indicar si el registro está borrado o no y en algún momento borrar todos los marcados para dicho fin, la segunda es hacer un bucle e ir copiando cada registro en un archivo temporal (salteando el elegido para borrar) y luego re nombrarlo con el nombre original, . -
Si tengo unos 15.000 registros cual de los 2 métodos utilizarían, o tal vez haya alguna otra manera más eficiente que desconozco. -
Una pregunta más, cual lejos está un archivo de transformarse en una tabla o base de datos. -

Saludos
#105
6 - Buscar

Hola, muy buen día para todos. -
Tengo algo mal echo en la función strcmp que no logro discernir, estuve consultando en un montón de páginas y tal vez tenga que ver con cadena constantes y no pero no logro hacer que funcione, si lo pongo a mano por Ej.:
encontrado = strcmp( espaniol, "hogar" );
el resultado es correcto. -
MAFUS, maravilloso lo tuyo, funciona a la perfección. -

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

#define MAX_CAR 30

void buscarCampo( FILE *pArchivo );


int main( void ){

FILE *pArchivo = fopen( "../Escribir/pruebaE.txt", "r" );

if( pArchivo != NULL ){
buscarCampo( pArchivo );

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


return 0;
}

void buscarCampo( FILE *pArchivo ){
int encontrado=0, orden;
char ingles[MAX_CAR], espaniol[MAX_CAR], buscar[MAX_CAR], *p=NULL;

printf( "\n Intoduzca la palabra a buscar.....: " );
fgets( buscar, MAX_CAR, stdin );
if(( p=strchr(ingles, '\n' ))){
*p='\0';
}

while( !feof(pArchivo) ){
fscanf(pArchivo,"%d\t%30[^\t]\t%30[^\n]",&orden, ingles, espaniol);
encontrado = strcmp( espaniol, buscar );
if( encontrado != 0 ){
encontrado = strcmp( ingles, buscar );
}
if( encontrado == 0){
printf( "\n\n Orden  Ingles                          Espaniol\n\n" );
printf(" %d\t%-30s\t%-30s\n",orden, ingles, espaniol);
break;
}
}
if( encontrado != 0 ){
printf( "\n No existe..." );
}
}


Saludos y muchas gracias. -
#106
5 - Leer/escribir

Hola.
Hoy estoy un poco cargoso, espero sepan comprender mi ansiedad por resolver esto. -
Les dejo los 2 códigos para escribir en archivos y leer desde un archivo, quisieran que lo revisen con tiempo y me digan que estoy asiendo mal, en realidad escribir me parece que funciona bien, en cuanto a leer lee solamente la primer linea y se produce un bucle infinito. -  
Una cosita mas, la línea 39 del archivo leer no me place para nada, ¿con que otra función la puedo reemplazar?. -
MAFUS, gracias por el aporte y que agrado da leerte nuevamente. -

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

void limpiar( void );
void leer( FILE *pArchivo );

int main( void ){

// FILE *pArchivo = fopen( "/home/daniel/Escritorio/Prueba/Archivos Daniel/Escribir/pruebaE.txt", "r" ); //Comando locate
FILE *pArchivo = fopen( "../Escribir/pruebaE.txt", "r" );

if( pArchivo != NULL ){
leer( pArchivo );

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


return 0;

}

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


void leer( FILE *pArchivo ){
int orden=0;
char nombre[30];
double salario;

printf( "\n\n Orden  Nombre          Salario\n\n" );

while( !feof(pArchivo) ){
fscanf(pArchivo,"%d\t%[^\n]\t%lf",&orden,nombre,&salario);
printf(" %d\t%-10s\t%lf",orden,nombre,salario);
}
}


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

#define MAX_CAR 30

void limpiar( void );
void agregar( FILE *pArchivo );

int main( void ){

FILE *pArchivo = fopen( "pruebaE.txt", "a+" );

if( pArchivo != NULL ){
agregar( pArchivo );

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


return 0;

}

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


void agregar( FILE *pArchivo ){
int n = 1, ch, orden=0, escrito;
char nombre[MAX_CAR], caracter, *p=NULL;
double salario;

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, MAX_CAR, stdin );
if(( p=strchr(nombre, '\n' ))){
*p='\0';
}
printf( "\n Introduzca el SALARIO del empleado....:" );
scanf( "%lf", &salario );
while ((ch = getchar()) != EOF && ch != '\n');

escrito = fprintf( pArchivo, "%d\t%s\t%lf\n", orden, nombre, salario );
}
if( escrito < 1 ){
printf( "\n ERROR!!! No se pudieron guardar los datos en el archivo."
"\n Pulse una tecla para continuar..."); getchar();
}
}while( n > 0 );
}


Un abrazso.
#107
Estoy probando un montón de maneras y no me funciona, te dejo algunos datos para ver si me podes dar la solución. -

Esto es lo que sale al abrir un terminal
Citardaniel@daniel-H81M-S1 ~ $

Y esta es la ruta(carpetas) completa...
.../Escritorio/Prueba/Archivos Daniel/Escribir/pruebaE.txt

Y donde esta el programa con el que estoy trabajando es:
.../Escritorio/Prueba/Archivos Daniel/Leer

Saludos.


Bueno ya lo logre con el comando locate.
FILE *pArchivo = fopen( "/home/daniel/Escritorio/Prueba/Archivos Daniel/Escribir/pruebaE.txt", "r" ); //Comando locate

pero vaya sorpresa me imprime solo el primer registro (todos los campos) pero no salta al segundo, como que se quedaría en un bucle infinito, practico un poco y si no lo logro les consulto. -

Buen día. -
#108
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.
#109
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.
#110
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.