Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: nolosabe en 6 Octubre 2011, 22:43 pm



Título: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 6 Octubre 2011, 22:43 pm
tengo un codigo que hice de un diccionario, pero trao y trato y no me sale el tema de que el usuario ingrese una cadena y el programa la busque en el archivo y la almacene en el "struct dato"...
les paso el codigo

Código:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
void alta(int);
/*void baja();
void modificar();
void consultar();
void listarSin(int);
void listarAnt();
void listarPar();*/
void subMenu();
int total();
 
#define LARGO 100
#define DICCIONARIO "c:\dicc.bin"
 
struct dato{
char palabra[20];
char sinonimo1[20],sinonimo2[20],sinonimo3[20];
char antonimo[20];
char paronimo[20];
int borrado;
}diccionario[LARGO];
 
FILE *archivo = NULL;
 
void main(){
int opcion=0,pos=total();
char salir='n';
while (salir!='s'){
clrscr();
printf("\n   DICCIONARIO \n");
printf("1) Ingresar \n");
printf("2) Eliminar \n");
printf("3) Modificar \n");
printf("4) Consultar \n");
printf("5) Listar \n");
printf("0) Salir \n");
opcion=getch();
switch(opcion){
case '1': pos=total();
pos++;
alta(pos);
break;
case '2': //baja();
break;
case '3': //modificar();
break;
case '4': //consultar();
break;
case '5': subMenu();
break;
case '0': printf("\n &#168;Esta seguro que desea salir? (s/n)");
salir=getch();
clrscr();
break;
default:printf("\n opcion incorrecta");
getch();
clrscr();
break;
}//fin switch
}//fin while
}//fin void main
 
 
 
void subMenu(){
clrscr();
int opc;
char salir='n';
printf("\n Listar Palabras existentes \n");
printf("\n1) Listar sinonimos");
printf("\n2) Listar antonimos");
printf("\n3) Listar paronimos");
printf("\n4) Listar: sinonimos, antonimos y paronimos");
printf("\n0) Volver al menu principal");
opc=getch();
clrscr();
while(salir!='s'){
switch(opc){
case '1': //listarSin();
break;
case '2': //listarAnt();
break;
case '3': //listarPar();
break;
case '4': //listarSin();
//listarAnt();
//listarPar();
break;
case '0': printf("\n &#168;Desea volver al menu principal (s/n)?");
salir=getch();
break;
default:printf("\n OPCION INCORRECTA");
getch();
break;
}//Fin switch submenu
}//fin while
}//fin subMenu
 
 
int total(){
clrscr();
int total;
archivo=NULL;
archivo=fopen(DICCIONARIO,"rb");//abro el archivo diccionario.bin como solo lectura
if(archivo==NULL){
printf("\n Error al abrir el archivo");
fclose(archivo);
}
else{
fseek(archivo,0,SEEK_END);
total=ftell(archivo) / sizeof(struct dato);//divido el tama&#164;o del archivo entre el tama&#164;o de la estructura para saber cuantas hay
}
return total;//devuelvo el valor de la variable total(int)
}
 
void alta(int pos){
char opc=' ',confirmar=' ';
archivo=NULL;
clrscr();
printf("\n Ingresar palabra/s \n");
printf("\n Palabra: ");
gets(diccionario[pos].palabra);
clrscr();
printf("\n &#168;Desea ingresar un sinonimo? (s/n)");
opc='a';
// while(opc!='s' || opc!='n'){
opc=getch();
if(opc=='s'){
clrscr();
printf("ingrese un sinonimo: ");
gets(diccionario[pos].sinonimo1);
opc=' ';
clrscr();
printf("\n&#168;Desea ingresar otro sinonimo? (s/n)");
opc=getch();
if(opc=='s'){
clrscr();
printf("ingrese otro sinonimo: ");
gets(diccionario[pos].sinonimo2);
opc=' ';
clrscr();
printf("\n&#168;Desea ingresar otro sinonimo? (s/n)");
opc=getch();
if(opc=='s'){
clrscr();
printf("ingrese otro sinonimo: ");
gets(diccionario[pos].sinonimo3);
}//if3
}//if2
}//if1
// }//while
 
clrscr();
printf(" Ingrese un antonimo: ");
gets(diccionario[pos].antonimo);
printf("\n Ingrese un paronimo o presione enter para no ingresar nada: ");
gets(diccionario[pos].paronimo);
clrscr();
printf(" Usted ingreso\n");
printf("\n\n Palabra: %s \n Sinonimos: %s, %s, %s\n Antonimo: %s\n Paronimo: %s",diccionario[pos].palabra,diccionario[pos].sinonimo1,diccionario[pos].sinonimo2,diccionario[pos].sinonimo3,diccionario[pos].antonimo,diccionario[pos].paronimo);
printf("\n\n Esta seguro que desea agregar estos datos al diccionario(s/n)");
confirmar=getch();
if(confirmar=='n'){
printf("\n Los datos no se escribieron en el archivo");
}//IF
else{ if(confirmar=='s'){
archivo=fopen(DICCIONARIO,"ab+");
fwrite(&diccionario[pos],sizeof(struct dato),1,archivo);
fclose(archivo);
}//if
}//else
}//funcion


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: satu en 7 Octubre 2011, 00:23 am
Hola

Tienes varios errores, leete esto (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

He visto el código en el otro post que tienes y he hecho el ejercicio en 15 minutos basándome en lo que tienes hecho, creo que funciona todo.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define DICCIONARIO "diccionario.bin"
  6.  
  7.  
  8. void alta();
  9. void baja();
  10. void modificar();
  11. void consultar();
  12. void listarSin();
  13. void listarAnt();
  14. void listarPar();
  15. void subMenu();
  16. int total();
  17.  
  18. struct dato{
  19. char palabra[20];
  20. char sinonimo1[20], sinonimo2[20], sinonimo3[20];
  21. char antonimo[20];
  22. char paronimo[20];
  23. };
  24.  
  25.  
  26. int main(void)
  27. {
  28. int opcion=0;
  29. char salir='n';
  30. FILE *archivo;
  31.  
  32.    archivo = fopen(DICCIONARIO, "rb");
  33.    if(!archivo)
  34.        archivo = fopen(DICCIONARIO, "wb");
  35.    fclose(archivo);
  36.  
  37. while (salir!='s')
  38.        {
  39.        printf("\n   DICCIONARIO \n");
  40.        printf("1) Ingresar \n");
  41.        printf("2) Eliminar \n");
  42.        printf("3) Modificar \n");
  43.        printf("4) Consultar \n");
  44.        printf("5) Listar \n");
  45.        printf("0) Salir \n");
  46.        scanf("%i", &opcion);
  47.        while(getchar()!='\n');
  48.  
  49.        switch(opcion)
  50.            {
  51.            case 1:
  52.                alta();
  53.                break;
  54.            case 2:
  55.                baja();
  56.                break;
  57.            case 3:
  58.                modificar();
  59.                break;
  60.            case 4:
  61.                consultar();
  62.                break;
  63.            case 5:
  64.                subMenu();
  65.                break;
  66.            case 0:
  67.                printf("\nEsta seguro que desea salir? (s/n)\n");
  68.                scanf("%c", &salir);
  69.                while(getchar()!='\n');
  70.                break;
  71.            default:
  72.                printf("Opcion incorrecta\n\n");
  73.                break;
  74.            }//fin switch
  75. }//fin while
  76.    return 0;
  77. }//fin int main
  78.  
  79.  
  80. void subMenu()
  81. {
  82. int opc, ok=0;
  83. FILE *archivo;
  84. char salir='n';
  85.  
  86. archivo = fopen(DICCIONARIO, "rb");
  87. if(archivo)
  88.        {
  89.        fseek(archivo, 0, SEEK_END);
  90.        if(ftell(archivo) != 0)
  91.            ok = 1;
  92.        fclose(archivo);
  93.        }
  94.  
  95.    if(ok)
  96.        {
  97.        while(salir!='s')
  98.            {
  99.            printf("\n Listar Palabras existentes \n");
  100.            printf("\n1) Listar sinonimos");
  101.            printf("\n2) Listar antonimos");
  102.            printf("\n3) Listar paronimos");
  103.            printf("\n4) Listar: sinonimos, antonimos y paronimos");
  104.            printf("\n0) Volver al menu principal\n");
  105.            scanf("%i", &opc);
  106.            while(getchar()!='\n');
  107.  
  108.            switch(opc)
  109.                {
  110.                case 1:
  111.                    listarSin();
  112.                    break;
  113.                case 2:
  114.                    listarAnt();
  115.                    break;
  116.                case 3:
  117.                    listarPar();
  118.                    break;
  119.                case 4:
  120.                    listarSin();
  121.                    listarAnt();
  122.                    listarPar();
  123.                    break;
  124.                case 0:
  125.                    salir='s';
  126.                    break;
  127.                default:
  128.                    printf("\nOPCION INCORRECTA\n\n");
  129.                    break;
  130.                }
  131.            }
  132.        }
  133.    else
  134.        printf("El diccionario esta vacio\n\n");
  135. }//fin subMenu
  136.  
  137.  
  138. int total()
  139. {
  140. int total = 0;
  141. FILE *archivo;
  142. archivo=fopen(DICCIONARIO, "rb");//abro el archivo diccionario.bin como solo lectura
  143. if(archivo==NULL)
  144. printf("\nError al abrir el archivo %s\n\n", DICCIONARIO);
  145. else
  146.        {
  147. fseek(archivo,0,SEEK_END);
  148. total=ftell(archivo) / sizeof(struct dato);//divido el tama¤o del archivo entre el tama¤o de la estructura para saber cuantas hay
  149. fclose(archivo);
  150.        }
  151. return total;
  152. }
  153.  
  154.  
  155. void alta()
  156. {
  157. char opc;
  158. struct dato aux;
  159. FILE *archivo;
  160.  
  161. memset(&aux, 0x00, sizeof(struct dato));
  162. printf("\nIngresar palabra/s \n");
  163. printf("\nPalabra: ");
  164. fgets(aux.palabra, 20, stdin);
  165.  
  166.    printf("Ingresa un sinonimo: ");
  167.    fgets(aux.sinonimo1, 20, stdin);
  168.  
  169.    printf("Desea ingresar otro sinonimo? (s/n): ");
  170.    scanf("%c", &opc);
  171.    while(getchar()!='\n');
  172.    if(opc=='s')
  173.        {
  174.        printf("Ingrese otro sinonimo: ");
  175.        fgets(aux.sinonimo2, 20, stdin);
  176.  
  177.        printf("Desea ingresar otro sinonimo? (s/n): ");
  178.        scanf("%c", &opc);
  179.        while(getchar()!='\n');
  180.        if(opc=='s')
  181.            {
  182.            printf("Ingrese otro sinonimo: ");
  183.            fgets(aux.sinonimo3, 20, stdin);
  184.            }
  185.        }//if2
  186.  
  187. printf("Ingrese un antonimo: ");
  188. fgets(aux.antonimo, 20, stdin);
  189.  
  190. printf("Ingrese un paronimo: ");
  191. fgets(aux.paronimo, 20, stdin);
  192.  
  193. printf("\nUsted ingreso:\n");
  194. printf("Palabra: %s \nSinonimos:\n\t%s \n\t%s \n\t%s \nAntonimo:\n\t%s \nParonimo: \n\t%s", aux.palabra, aux.sinonimo1, aux.sinonimo2, aux.sinonimo3, aux.antonimo, aux.paronimo);
  195. do
  196.        {
  197.        printf("\n\nEsta seguro que desea agregar estos datos al diccionario(s/n): ");
  198.        scanf("%c", &opc);
  199.        while(getchar()!='\n');
  200.        }
  201. while(opc!='s' && opc!='n');
  202.  
  203. if(opc=='s')
  204.        {
  205. archivo=fopen(DICCIONARIO, "a+b");
  206. if(archivo)
  207.            {
  208.            fwrite(&aux, sizeof(struct dato), 1, archivo);
  209.            fclose(archivo);
  210.            }
  211. }//if
  212. }//funcion
  213.  
  214.  
  215. void baja()
  216. {
  217.    char palabra[20];
  218.    FILE *archivo;
  219.    int ok = 0, i = 0, n = total();
  220.    struct dato aux, aux2[n];
  221.  
  222.    archivo = fopen(DICCIONARIO, "rb");
  223. if(archivo)
  224.        {
  225.        fseek(archivo, 0, SEEK_END);
  226.        if(ftell(archivo) != 0)
  227.            ok = 1;
  228.        fclose(archivo);
  229.        }
  230.  
  231.    if(ok)
  232.        {
  233.        memset(&palabra, 0x00, 20);
  234.        memset(&aux, 0x00, sizeof(struct dato));
  235.        memset(&aux2, 0x00, sizeof(aux2));
  236.  
  237.        printf("Ingresa la palabra a eliminar: ");
  238.        fgets(palabra, 20, stdin);
  239.        archivo = fopen(DICCIONARIO, "rb");
  240.        if(archivo)
  241.            {
  242.            while(!feof(archivo))
  243.                if(fread(&aux, sizeof(struct dato), 1, archivo))
  244.                    if(strcmp(palabra, aux.palabra)!=0)
  245.                        {
  246.                        strcpy(aux2[i].palabra, aux.palabra);
  247.                        strcpy(aux2[i].sinonimo1, aux.sinonimo1);
  248.                        strcpy(aux2[i].sinonimo2, aux.sinonimo2);
  249.                        strcpy(aux2[i].sinonimo3, aux.sinonimo3);
  250.                        strcpy(aux2[i].antonimo, aux.antonimo);
  251.                        strcpy(aux2[i].paronimo, aux.paronimo);
  252.                        i++;
  253.                        }
  254.            fclose(archivo);
  255.  
  256.            if(i < n)
  257.                {
  258.                remove(DICCIONARIO);
  259.                archivo = fopen(DICCIONARIO, "wb");
  260.                if(archivo)
  261.                    {
  262.                    for(i=0; i<n-1; i++)
  263.                        fwrite(&aux2[i], sizeof(struct dato), 1, archivo);
  264.                    fclose(archivo);
  265.                    }
  266.                printf("Palabra eliminada con exito\n\n");
  267.                }
  268.            else
  269.                printf("No se encuentra la palaba en el diccionario\n\n");
  270.            }
  271.        }
  272.    else
  273.        printf("El diccionario no se encuentra o esta vacio\n\n");
  274. }
  275.  
  276.  
  277. void modificar()
  278. {
  279. char opc;
  280. struct dato aux;
  281. FILE *archivo;
  282. char palabra[20];
  283. int enc = 0, ok = 0;
  284.  
  285. archivo = fopen(DICCIONARIO, "rb");
  286. if(archivo)
  287.        {
  288.        fseek(archivo, 0, SEEK_END);
  289.        if(ftell(archivo) != 0)
  290.            ok = 1;
  291.        fclose(archivo);
  292.        }
  293.  
  294.    if(ok)
  295.        {
  296.        memset(&aux, 0x00, sizeof(struct dato));
  297.        archivo = fopen(DICCIONARIO, "r+b");
  298.        if(archivo)
  299.            {
  300.            printf("Ingresa la palabra a modificar: ");
  301.            fgets(palabra, 20, stdin);
  302.  
  303.            while(!enc && !feof(archivo))
  304.                {
  305.                fread(&aux, sizeof(struct dato), 1, archivo);
  306.                if(strcmp(palabra, aux.palabra)==0)
  307.                    enc = 1;
  308.                }
  309.  
  310.            if(enc)
  311.                {
  312.                fseek(archivo, sizeof(struct dato)*(-1), SEEK_CUR);
  313.                printf("Introduce la nueva palabra: ");
  314.                fgets(aux.palabra, 20, stdin);
  315.                printf("Introduce un sinonimo: ");
  316.                fgets(aux.sinonimo1, 20, stdin);
  317.                do
  318.                    {
  319.                    printf("Quieres introducir otro sinonimo? (s/n)");
  320.                    scanf("%c", &opc);
  321.                    while(getchar()!='\n');
  322.                    }
  323.                while(opc!='s' && opc!='n');
  324.  
  325.                if(opc=='s')
  326.                    {
  327.                    printf("Introduce otro sinonimo: ");
  328.                    fgets(aux.sinonimo2, 20, stdin);
  329.  
  330.                    do
  331.                        {
  332.                        printf("Quieres introducir otro sinonimo? (s/n)");
  333.                        scanf("%c", &opc);
  334.                        while(getchar()!='\n');
  335.                        }
  336.                    while(opc!='s' && opc!='n');
  337.  
  338.                    if(opc=='s')
  339.                        {
  340.                        printf("Introduce otro sinonimo: ");
  341.                        fgets(aux.sinonimo3, 20, stdin);
  342.                        }
  343.                    }
  344.                printf("Introduce un antonimo: ");
  345.                fgets(aux.antonimo, 20, stdin);
  346.                printf("Introduce un paronimo: ");
  347.                fgets(aux.paronimo, 20, stdin);
  348.  
  349.                fwrite(&aux, sizeof(struct dato), 1, archivo);
  350.                printf("Palabra modificada correctamente\n\n");
  351.                }
  352.            else
  353.                printf("No se ha encontrado la palabra: %s\n\n", palabra);
  354.            fclose(archivo);
  355.            }
  356.        else
  357.            printf("No se puede abrir el diccionario\n\n");
  358.        }
  359.    else
  360.        printf("El diccionario no se encuentra o esta vacio\n\n");
  361. }
  362.  
  363.  
  364. void consultar()
  365. {
  366. struct dato aux;
  367. FILE *archivo;
  368. char palabra[20];
  369. int enc = 0, ok = 0;
  370.  
  371. archivo = fopen(DICCIONARIO, "rb");
  372. if(archivo)
  373.        {
  374.        fseek(archivo, 0, SEEK_END);
  375.        if(ftell(archivo) != 0)
  376.            ok = 1;
  377.        fclose(archivo);
  378.        }
  379.  
  380.    if(ok)
  381.        {
  382.        memset(&aux, 0x00, sizeof(struct dato));
  383.        archivo = fopen(DICCIONARIO, "rb");
  384.        if(archivo)
  385.            {
  386.            printf("Ingresa la palabra a consultar: ");
  387.            fgets(palabra, 20, stdin);
  388.  
  389.            while(!enc && !feof(archivo))
  390.                {
  391.                fread(&aux, sizeof(struct dato), 1, archivo);
  392.                if(strcmp(palabra, aux.palabra)==0)
  393.                    enc = 1;
  394.                }
  395.            fclose(archivo);
  396.  
  397.            if(enc)
  398.                printf("Palabra: %s \nSinonimos: \n\t%s \n\t%s \n\t%s \nAntonimo: \n\t%s \nParonimo: \n\t%s", aux.palabra, aux.sinonimo1, aux.sinonimo2, aux.sinonimo3, aux.antonimo, aux.paronimo);
  399.            else
  400.                printf("La palabra no se encuentra\n\n");
  401.            }
  402.        else
  403.            printf("El diccionario no se encuentra o esta vacio\n\n");
  404.        }
  405.    else
  406.        printf("El diccionario no se encuentra o esta vacio\n\n");
  407. }
  408.  
  409.  
  410. void listarSin()
  411. {
  412.    struct dato aux;
  413. FILE *archivo;
  414.  
  415.    memset(&aux, 0x00, sizeof(struct dato));
  416.    archivo = fopen(DICCIONARIO, "rb");
  417.    if(archivo)
  418.        {
  419.        while(!feof(archivo))
  420.            if(fread(&aux, sizeof(struct dato), 1, archivo))
  421.                printf("Palabra: %s \nSinonimos: \n\t%s \n\t%s \n\t%s\n", aux.palabra, aux.sinonimo1, aux.sinonimo2, aux.sinonimo3);
  422.        fclose(archivo);
  423.        }
  424. }
  425.  
  426.  
  427. void listarAnt()
  428. {
  429.    struct dato aux;
  430. FILE *archivo;
  431.  
  432.    memset(&aux, 0x00, sizeof(struct dato));
  433.    archivo = fopen(DICCIONARIO, "rb");
  434.    if(archivo)
  435.        {
  436.        while(!feof(archivo))
  437.            if(fread(&aux, sizeof(struct dato), 1, archivo))
  438.                printf("Palabra: %s \nAntonimo: \n\t%s", aux.palabra, aux.antonimo);
  439.        fclose(archivo);
  440.        }
  441. }
  442.  
  443.  
  444. void listarPar()
  445. {
  446.    struct dato aux;
  447. FILE *archivo;
  448.  
  449.    memset(&aux, 0x00, sizeof(struct dato));
  450.    archivo = fopen(DICCIONARIO, "rb");
  451.    if(archivo)
  452.        {
  453.        while(!feof(archivo))
  454.            if(fread(&aux, sizeof(struct dato), 1, archivo))
  455.                printf("Palabra: %s \nParonimo: \n\t%s", aux.palabra, aux.paronimo);
  456.        fclose(archivo);
  457.        }
  458. }
  459.  

Si tienes alguna duda no dudes en preguntar.

Saludos


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 7 Octubre 2011, 01:57 am
Ok, lo voy a revisar y veré que puedo hacer por mi cuenta con los comandos que nos han enseñado, muchas gracias por tu tiempo y por la ayuda :D


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 7 Octubre 2011, 02:07 am
Disculpa/disculpen las molestias pero quisiera saber como funciona "memset" ya que ese comando no nos lo enseñaron, por eso utilizo fread y fwrite, y no puedo usar un comando que no nos hayan enseñado a no ser que sepa como funciona y lo entienda, la idea aquí no es que yo copie esto, sino que lo utilice como una manera de aprender y ahora quisiera poder tomar esto que tu has escrito y hacerlo con los comandos que nos enseñaron en el instituto :)


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: satu en 7 Octubre 2011, 15:33 pm
Hola

memset (http://www.cplusplus.com/reference/clibrary/cstring/memset/): lo que hace es rellenar la memoria de lo que le pasas en el primer parámetro con el valor que le pasas en el segundo parámetro el nº de bytes que le pasas en el tercer parámetro, en el caso del ejercicio:
memset(&aux, 0x00, sizeof(struct dato));
Lo que hace es rellenar la memoria donde está la variable aux de ceros (0)

Saludos


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 7 Octubre 2011, 21:21 pm
Bueno, tengo un par de preguntas para entender mejor el funcionamiento del programa, espero no ser pesado.

¿si yo en una función pongo "struct dato aux" la estructura aux va a tener todo lo mismo que la que declare arriba afuera del main?

en el siguiente caso " if(ok)"¿cuando se cumple el if, cuando es 0 o cuando es otro valor distinto a 0 o cuando?

¿y en este caso
"archivo = fopen(DICCIONARIO, "rb");
if(archivo)"
cuando se cumple el if y cuando no?

¿que significa esto?
 while(!enc && !feof(archivo))


disculpen tantas preguntas es que nosotros nunca usamos una sintaxis asi en nuestro curso, imagino que asi es mejor, es ams rapido, mas corto, por eso me gustaria entenderlo y aprenderlo, se que vamos atrasados en el curso, pero alguna vez hay que empezar, ya llegara el dia que vamos a saber mas, yo y mis compañeros

GRACIAS :D


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: satu en 7 Octubre 2011, 22:31 pm
Hola

Vamos por partes

¿si yo en una función pongo "struct dato aux" la estructura aux va a tener todo lo mismo que la que declare arriba afuera del main?

Claro, ya que cuando declaras arriba "struct dato" estás creando un tipo de datos y cada vez que crees una variable de este tipo, en este caso "aux", va a tener los mismos campos: char nombre[20], char sinonimo1[20], etc.


en el siguiente caso " if(ok)"¿cuando se cumple el if, cuando es 0 o cuando es otro valor distinto a 0 o cuando?

El if se cumple SIEMPRE cuando la condición de dentro es verdadera, es decir cuando distinto de cero o de NULL


¿y en este caso
"archivo = fopen(DICCIONARIO, "rb");
if(archivo)"
cuando se cumple el if y cuando no?

La condición del if se cumple cuando "archivo" es distinto de NULL. Si el fopen hubiese fallado por cualquier motivo entonces "archivo" valdría NULL y el if no se cumpliría


¿que significa esto?
while(!enc && !feof(archivo))

feof es una función que indica si se ha llegado al final del fichero y "enc" es una variable auxiliar que se utiliza para no tener que recorrer el fichero entero buscando el dato. Inicialmente vale 0, cuando se encuentra el dato buscado lo ponemos a 1 y ya sale del while. Entonces lo que dice es que mientras no se llegue al final del fichero y no se haya encontrado el dato se ejecute lo de dentro.

Espero haberte sido de ayuda, si sigues teniendo dudas ya sabes.

Saludos


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 7 Octubre 2011, 23:10 pm
Gracias, me fue de MUCHÍSIMA ayuda, lo voy a utilizar para crear el código de este trabajo por mi mismo y para los próximos.

 ;D


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: satu en 8 Octubre 2011, 12:13 pm
Hola

Me alegro mucho por ti, si sigues teniendo dudas o lo que sea ya sabes donde estamos.

Saludos


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 9 Octubre 2011, 04:36 am
Disculpa, cuando hago el void consulta
struct dato aux;

en donde lo uso con memset(&aux,0x00,sizeof(struct dato));
me dice improper use of typedef aux
______________________

EDIT:
SOLUCIONADO fue un error mio de tipeo


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 11 Octubre 2011, 17:49 pm
.

Hola, disculpa la joda, pero estas funciones me dan bucle



Código:
void listarAnt()
{
    struct dato aux;
FILE *archivo;
 
    memset(&aux, 0x00, sizeof(struct dato));
    archivo = fopen(DICCIONARIO, "rb");
    if(archivo)
        {
        while(!feof(archivo))
            if(fread(&aux, sizeof(struct dato), 1, archivo))
                printf("Palabra: %s \nAntonimo: \n\t%s", aux.palabra, aux.antonimo);
        fclose(archivo);
        }
}
 
 
void listarPar()
{
    struct dato aux;
FILE *archivo;
 
    memset(&aux, 0x00, sizeof(struct dato));
    archivo = fopen(DICCIONARIO, "rb");
    if(archivo)
        {
        while(!feof(archivo))
            if(fread(&aux, sizeof(struct dato), 1, archivo))
                printf("Palabra: %s \nParonimo: \n\t%s", aux.palabra, aux.paronimo);
        fclose(archivo);
        }
}


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: rir3760 en 11 Octubre 2011, 18:35 pm
Si tienes un problema debes describirlo de una forma clara, si solo indicas "me dan bucle" no nos ayudas. Si para empezar los datos se guardaron correctamente entonces esas funciones no deben generar errores, si modificaste el programa entonces por favor publica el código fuente completo.

Ese par se puede reducir a:
Código
  1. void listarAnt()
  2. {
  3.   FILE *archivo;
  4.   struct dato aux;
  5.  
  6.   if ((archivo = fopen (DICCIONARIO, "rb")) != NULL){
  7.      while (fread (&aux, sizeof (struct dato), 1, archivo) == 1)
  8.         printf ("Palabra: %s \nAntonimo: \n\t%s", aux.palabra, aux.antonimo);
  9.      fclose (archivo);
  10.   }
  11. }
  12.  
  13.  
  14. void listarPar()
  15. {
  16.   FILE *archivo;
  17.   struct dato aux;
  18.  
  19.   if ((archivo = fopen (DICCIONARIO, "rb")) != NULL){
  20.      while (fread (&aux, sizeof (struct dato), 1, archivo) == 1)
  21.         printf ("Palabra: %s \nParonimo: \n\t%s", aux.palabra, aux.paronimo);
  22.      fclose (archivo);
  23.   }
  24. }


Pero de nuevo lo que debes hacer es explicar en detalle el problema y presentar el código fuente modificado.

Un saludo


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 11 Octubre 2011, 19:30 pm
YA ENCONTRE EL ERROR, ESTABA EN EL SUB MENU DONDE SE LLAMABA A LA FUNCION... ACA SE LOS DEJO


Código
  1. void subMenu(){
  2. clrscr();
  3. int opc;
  4. char salir='n';
  5.  
  6. archivo=fopen(DICCIONARIO,"rb");
  7. if(archivo){
  8.  
  9. printf("\n Listar Palabras existentes \n");
  10.  
  11. printf("\n1) Listar antonimos");
  12. printf("\n2) Listar paronimos");
  13. printf("\n3) Listar: sinonimos, antonimos y paronimos");
  14. printf("\n0) Volver al menu principal\n");
  15. opc=getch();
  16. clrscr();                               //EL ERROR ES TODO ESTO QUE ESTA
  17. while(salir!='s'){                  //AFUERA DEL WHILE, EL GETCH ESTA AFUERA
  18. switch(opc){               //ENTONCES EL WHILE NO PARA PARA PEDIR SI QUIERES SALIR
  19.  
  20. case '1': //listarAnt();
  21. break;
  22. case '2': //listarPar();
  23. break;
  24. case '3': //listarTodo();
  25. break;
  26. case '0': salir='s';
  27. break;
  28. default:printf("\n OPCION INCORRECTA");
  29. getch();
  30. break;
  31. }//Fin switch submenu
  32. }//fin while
  33. }//fin if
  34. else{
  35. printf("\n OCURRIO UN ERROR AL ABRIR EL ARCHIVO");
  36. }//fin else
  37. }//fin subMenu
  38.  


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 12 Octubre 2011, 18:43 pm
Compañeros, tengo otra duda, supongamos que yo uso "fread(&aux,sizeof(struct dato),1,archivo);"

y quiero que imprima lo que queda guardado en cierto campo de "aux" si y solo si, ese campo no esta vacio...
como lo hago?
probe usando:
"if(aux.antonimo!=NULL){"
"if(aux.antonimo!=""){"
"if(aux.antonimo!="\0"){"
"if(aux.antonimo!="            "){"

Y ninguna de esas maneras me funciono... alguna sugerencia

recuerden que estoy leyendo desde un binario, lo guardo en struct dato aux y despues lo controlo de ahi

GRACIAS  ;D


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: El_Java en 12 Octubre 2011, 19:17 pm
prueba poniendo algo como:
Código
  1. if(aux.antonimo);
  2. //o tambien
  3. if(aux.antonimo[0] != '\0');
  4.  
Un saludo.


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: rir3760 en 12 Octubre 2011, 19:52 pm
En C no puedes comparar directamente dos cadenas. Como ya te indico El_Java debes verificar si el primer caracter de la cadena es diferente de '\0', solo si es asi la imprimes:
Código
  1. if (aux.antonimo[0] != '\0'){
  2.   /* La cadena no esta vacia, la imprimes */
  3. }

Un saludo


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 12 Octubre 2011, 20:26 pm
Muchas gracias a los 2!
funciono:
Código
  1. if(aux.antonimo[0] != '\0');
  2.  


Título: Re: [?] leer binario y guardar en struct dato AYUDA
Publicado por: nolosabe en 29 Octubre 2011, 15:44 pm
Usando el codigo que me dieron en la primer respuesta, quiero hacer una funcion para eliminar palabras que no sea del estilo que esta en ese codigo, sino que sea algo asi:

Código
  1. void baja(){
  2. int encontrado=0,ok=0,posicion=0;
  3. struct dato aux;
  4. char palabra[20],opc='n';
  5. FILE *archivo;
  6. clrscr();
  7. archivo=fopen(DICCIONARIO,"rb");
  8. if(archivo!=NULL){
  9. fseek(archivo,0,SEEK_END);
  10. if(ftell(archivo)!=0)
  11. ok=1;
  12. fclose(archivo);
  13. }
  14. if(ok==1){
  15. memset(&aux,0x00,sizeof(struct dato));
  16. memset(&palabra,0x00,20);
  17. archivo=fopen(DICCIONARIO,"rb");
  18. if(archivo!=NULL){
  19. gotoxy(20,2);
  20. printf("ELIMINAR PALABRAS\n");
  21. printf("\n Ingrese la palabra a eliminar: ");
  22. scanf("%s",&palabra);
  23. strlwr(palabra);
  24. while(encontrado==0 && !feof(archivo)){
  25. fread(&aux,sizeof(struct dato),1,archivo);
  26. if(strcmp(palabra,aux.palabra)==0){
  27. encontrado=1;
  28. }//strcmp
  29. }//while
  30. clrscr();
  31. if(encontrado==1){
  32. printf("\n Esta seguro que desea eliminar \n la siguiente entrada del diccionario (s/n)\n");
  33. printf("\n Palabra: %s \n Sinonimos: %s %s %s\n Antonimo: %s\n Paronimo: %s\n",aux.palabra,aux.sinonimo1,aux.sinonimo2,aux.sinonimo3,aux.antonimo,aux.paronimo);
  34. }
  35. else{
  36. printf("\n No se encontro la palabra ingresada\n");
  37. }
  38. fseek(archivo,0,SEEK_END);
  39. posicion=ftell(archivo);
  40. fclose(archivo);
  41. opc=getch();
  42. if(opc=='s' || opc=='S'){
  43. archivo=fopen(DICCIONARIO,"rb+");
  44.       // fseek(archivo,0,SEEK_SET);
  45. while(ftell(archivo)<=posicion){
  46. fread(&aux,sizeof(struct dato),1,archivo);
  47. fseek(archivo,sizeof(struct dato)*(-2),SEEK_CUR);
  48. fwrite(&aux,sizeof(struct dato),1,archivo);
  49. fseek(archivo,sizeof(struct dato),SEEK_CUR);
  50.  
  51. }
  52. fclose(archivo);
  53. }
  54. } }//if ok
  55. }//void


pero la verdad intente varias cosas y no me funciona bien, alguien me puede dar una mano por favor?